Можете ли вы определить IP-адрес источника и порт из подключенного TCP-сокета? - PullRequest
0 голосов
/ 09 июня 2011

Я бы хотел, чтобы мой сервер определял исходный IP-адрес и порт клиента из подключенного TCP-сокета. Поскольку мои клиенты, вероятно, отстают от NAT, я не могу рассчитывать на то, что клиент скажет мне (в протоколе соединения) ... Если это возможно, мне потребуется реализовать его как в Windows, так и в Linux. ..Но ответ на любой из них поможет мне начать ...

Я использую C и ищу решения на основе libc или msvcrt.

Ответы [ 3 ]

3 голосов
/ 09 июня 2011

Должно работать как в Linux, так и в Windows:

struct sockaddr_in addr;
socklen_t len;

len = sizeof addr;
getpeername(clientSocket, (struct sockaddr*)&addr, &len);
printf("Remote IP address: %s\n", inet_ntoa(addr.sin_addr));
2 голосов
/ 09 июня 2011

Если одноранговый узел находится за NAT, вы можете говорить о двух разных IP-адресах (из вашего вопроса неясно, какой вам нужен):

  • IP-адрес однорангового узла во внутренней сети (например, 192.168.1.2);
  • внешний IP-адрес самого NAT

В первом случае не существует решения, доступного из стека TCP / IP: эта информация просто нена вашем хосте не существует, поскольку NAT заменяет все внутренние IP-адреса своими IP-адресами для каждого пакета.Таким образом, единственным решением для вас будет поддержка этой функциональности в вашем протоколе.

В последнем случае вы можете просто спросить стек TCP / IP: getpeername () , как вы делаетеэто.

0 голосов
/ 09 июня 2011

Если ваши клиенты находятся за NAT, нет способа определить удаленный IP.Если вы попытаетесь это сделать, вы всегда получите NAT ip.Единственный известный мне способ - это отправить клиентский IP вместе с запросом на ваш сервер (как часть запроса).

Но вам не ясно, чего вы хотите.Вы не говорите нам, какой язык вы используете, ни о каком сервере вы говорите.Это помешает нам дать вам полезный ответ.

...