Как я могу получить IP-адрес подключенного хоста из Windows Socket (C ++)? - PullRequest
1 голос
/ 11 июля 2011

Я видел этот вопрос раньше, но так и не нашел ответ, который сработал. Мне нужно получить явный IP-адрес (т.е. 123.456.789.100) и номер PORT компьютера, к которому подключен мой сервер, чтобы переслать эту информацию другим клиентам. Я использую WinSock2.h в Windows 7 (Home Premium), Visual Studio 2010 Professional - создаю «консольное приложение C ++». Это TCP-соединение. Вот мой код:

sockaddr_in* addr = new sockaddr_in;
int addrsize = sizeof(addr);
getsockname(clientSock, (sockaddr*)addr, &addrsize);
char* ip = inet_ntoa(addr->sin_addr);
int port = addr->sin_port;
printf("IP: %s ... PORT:%d\n", ip, port);

Это всегда дает мне 205.205.205.205 для IP и 52685 для ПОРТА каждый раз. Я пробовал альтернативы, в том числе gethostbyname, который работает, но мне нужен сам фактический IP. Я также пробовал getpeername () вместо getsockname (), но результаты были идентичны. Я за роутером, но пока использую и сервер, и клиент на одной машине.

Заранее спасибо за любую помощь!

Ответы [ 2 ]

3 голосов
/ 11 июля 2011

getpeername () - это функция, которую вы хотите использовать.

Некоторые ошибки, которые я вижу в вашем коде:

1) Вы размещаете addr в куче.Нет необходимости делать это, просто объявите "sockaddr_in addr;"вместо этого в стеке и передайте & addr (вместо addr) в свой вызов getpeername ().

2) addrsize устанавливается в размере указателя (например, 4 или 8), а не в размерефактический sockaddr_in, что означает, что ...

3) getsockname (), вероятно, не работает, но вы этого не знаете, потому что

4) Вы не проверяете возвращаемое значениеgetockname (), чтобы увидеть, была ли ошибка или нет, это означает, что

5) Результаты, которые вы видите, просто показывают вам, какие случайные данные мусора были в (* addr) перед getockname () / getpeername(), потому что вызов не удался, не записав ничего в структуру addr.

6) О, еще одна вещь ... не забудьте обернуть вашу ссылку на addr.sin_addr в вызов ntohl (),и ваша ссылка на addr.sin_port в вызове ntohs (), или вы получите их в формате с прямым порядком байтов при работе на компьютере с прямым порядком байтов (читай: на базе Intel), а это не то, что вам нужно.

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

Да, вы были правы, выдает ошибку, и я не проверял ее Большое спасибо, ваше решение сработало. Последний код, который работал для меня, был следующим:

sockaddr_in addr;
int addrsize = sizeof(addr);
int result = getpeername(clientSock, (sockaddr*) &addr, &addrsize);
printf("Result = %d\n", result);
char* ip = inet_ntoa(addr.sin_addr);
int port = addr.sin_port;
printf("IP: %s ... PORT: %d\n", ip, port);

И это дало мне правильные результаты. Я ценю вашу помощь. Спасибо!

...