Ответ 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-адрес используется в этом соединении.