Как я могу получить информацию об IP из сокета UDP (Windows C ++)? - PullRequest
2 голосов
/ 12 июля 2011

Я попытался найти IP-адрес, к которому привязан мой сокет UDP (при условии, что я не хочу использовать другой метод для определения IP-адреса компьютера). Как это может быть сделано? Код ниже работает для номера порта, но всегда возвращает 0.0.0.0 для адреса:

struct sockaddr_in sin;
int addrlen = sizeof(sin);
if(getsockname(clientSock, (struct sockaddr *)&sin, &addrlen) == 0 &&
    sin.sin_family == AF_INET &&
    addrlen == sizeof(sin)){
    printf("RETURNING ADDR: %s: len = %d\n", inet_ntoa(sin.sin_addr),
        strlen(inet_ntoa(sin.sin_addr)));
}

Сокет был связан с использованием следующего кода:

sockaddr_in local;
local.sin_family = AF_INET;
local.sin_addr.s_addr = INADDR_ANY;//inet_addr("127.0.0.1");
local.sin_port = 0; //assign given port
result = bind(clientSock, (sockaddr*)&local, sizeof(local));

Спасибо за любую помощь. Я ценю ваше время!

1 Ответ

2 голосов
/ 13 июля 2011

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

Если вы хотите getsockname() сообщить конкретный адрес, вам нужно bind()на этот конкретный адрес.Поэтому используйте GetAdaptersAddresses для перечисления всех интерфейсов на локальном хосте и bind() отдельный сокет для каждого адреса вместо привязки INADDR_ANY к одному сокету.

В противном случае выможет bind() один сокет к INADDR_ANY, а затем использовать WSARecvMsg() (вместо recv(), recvfrom() или WSARecvFrom()) для чтения входящих пакетов.WSARecvMsg() может сообщить подробности об интерфейсе прибытия каждого пакета и адресе назначения, если вы включите соответствующие опции с помощью setsockopt().

...