Как найти номер локального порта сокета?(Windows C ++) - PullRequest
4 голосов
/ 12 июля 2011

Я новичок в сети Windows и пытаюсь выяснить, к какому номеру PORT привязан мой сокет (C ++, Windows 7, Visual Studio 2010 Professional).Это сокет UDP, и, насколько я понимаю, использование следующей начальной настройки должно связать его со случайным доступным портом / адресом:

sockaddr_in local;
local.sin_family = AF_INET;
local.sin_addr.s_addr = INADDR_ANY;
local.sin_port = 0; //randomly selected port
int result = bind(clientSock, (sockaddr*)&local, sizeof(local));
//result is always 0

Что касается использования этого метода, он работает для отправки данных илипривязка его к определенному порту (замена 0 на желаемый номер порта).Что мне нужно, это связать его случайным образом, а затем выяснить, к какому порту он был подключен впоследствии.Есть ли способ, которым я могу сделать это?Кажется, что структура "local" содержит "0.0.0.0" в качестве IP-адреса и "0" в качестве номера PORT.

Спасибо за любую помощь!Я ценю это.

Ответы [ 2 ]

16 голосов
/ 12 июля 2011

Использование getsockname. Например:

struct sockaddr_in sin;
int addrlen = sizeof(sin);
if(getsockname(clientSock, (struct sockaddr *)&sin, &addrlen) == 0 &&
   sin.sin_family == AF_INET &&
   addrlen == sizeof(sin))
{
    int local_port = ntohs(sin.sin_port);
}
else
    ; // handle error

Это также работает для * nix-систем, но обратите внимание, что некоторые системы определяют третий аргумент getsockname для типа socklen_t* вместо int*, поэтому вы можете получать предупреждения о различающихся по подписи указателях, если вы пишете кроссплатформенный код.

1 голос
/ 12 июля 2011

getsockname может получить его для вас, но мне интересно, почему ваш код работает с сокетом UDP.

...