Сокеты - Как узнать, какой порт и адрес мне назначены - PullRequest
35 голосов
/ 28 октября 2010

Мне трудно понять это - я работаю с сокетами в C, используя это руководство - http://binarii.com/files/papers/c_sockets.txt

Я пытаюсь автоматически получить свой ip и порт, используя:

server.sin_port = 0;              /* bind() will choose a random port*/
server.sin_addr.s_addr = INADDR_ANY;  /* puts server's IP automatically */
...
...
bind(int fd, struct sockaddr *my_addr,int addrlen); // Bind function

После успешного связывания, как мне узнать, какие IP и порт мне назначены?

Ответы [ 2 ]

69 голосов
/ 29 октября 2010

Если это сокет сервера, вы должны набрать listen() на вашем сокете, а затем getsockname(), чтобы найти номер порта, на котором он прослушивает:

struct sockaddr_in sin;
socklen_t len = sizeof(sin);
if (getsockname(sock, (struct sockaddr *)&sin, &len) == -1)
    perror("getsockname");
else
    printf("port number %d\n", ntohs(sin.sin_port));

Что касается IP-адреса, если вы используете INADDR_ANY, то сокет сервера может принимать подключения к любому из IP-адресов аппарата, а сам сокет сервера не имеет определенного IP-адреса. Например, если ваша машина имеет два IP-адреса, вы можете получить два входящих соединения на этом сокете сервера, каждое из которых имеет свой локальный IP-адрес. Вы можете использовать getsockname() в сокете для определенного соединения (которое вы получаете от accept()), чтобы выяснить, какой локальный IP-адрес используется в этом соединении.

5 голосов
/ 29 октября 2010

Комментарий в вашем коде неверен.INADDR_ANY не устанавливает IP-адрес сервера автоматически '.По сути, это ставит 0.0.0.0 по причинам, объясненным в ответе mark4o .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...