Подтвердить что ты не робот

Сокеты - Как узнать, какой порт и адрес я назначен

Мне сложно понять это - я работаю с сокетами на 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 IP automatically */
...
...
bind(int fd, struct sockaddr *my_addr,int addrlen); // Bind function

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

4b9b3361

Ответ 1

Если это серверный сокет, вы должны вызвать 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-адрес используется в этом соединении.

Ответ 2

Комментарий в коде неправильный. INADDR_ANY не устанавливает IP-адрес сервера автоматически ". Он по существу ставит 0.0.0.0 по причинам, указанным в mark4o answer.