Как получить IP-адрес из структуры носка в c? - PullRequest
34 голосов
/ 17 июня 2010

Я пишу простой сервер / клиент и пытаюсь получить IP-адрес клиента и сохранить его на стороне сервера, чтобы решить, какой клиент должен попасть в критическую секцию.Я гуглял несколько раз, но не смог найти правильный способ получить IP-адрес из структуры sock.

Я считаю, что это способ получить IP из структуры sock после того, как сервер примет запрос от клиента.Более конкретно в c после сервера выполните

csock = accept(ssock, (struct sockaddr *)&client_addr, &clen) 

Спасибо

Ответы [ 3 ]

46 голосов
/ 17 июня 2010

ОК, если вы используете IPV4, затем выполните следующее:

struct sockaddr_in* pV4Addr = (struct sockaddr_in*)&client_addr;
struct in_addr ipAddr = pV4Addr->sin_addr;

Если вы хотите использовать IP-адрес в виде строки, выполните следующие действия:

char str[INET_ADDRSTRLEN];
inet_ntop( AF_INET, &ipAddr, str, INET_ADDRSTRLEN );

IPV6 также довольно прост ...

struct sockaddr_in6* pV6Addr = (struct sockaddr_in6*)&client_addr;
struct in6_addr ipAddr       = pV6Addr->sin6_addr;

и получение строки практически идентично IPV4

char str[INET6_ADDRSTRLEN];
inet_ntop( AF_INET6, &ipAddr, str, INET6_ADDRSTRLEN );
35 голосов
/ 18 апреля 2013

Более простой и правильный способ извлечения IP-адреса и номера порта:

printf("IP address is: %s\n", inet_ntoa(client_addr.sin_addr));
printf("port is: %d\n", (int) ntohs(client_addr.sin_port));

Принятый ответ SoapBox не будет правильным для всех архитектур.См. Большой и Маленький порядковый номер .

25 голосов
/ 17 июня 2010

Предполагается, что client_addr является struct sockaddr_in (что обычно и есть). Вы можете получить IP-адрес (как 32-разрядное целое число без знака) из client_addr.sin_addr.s_addr.

Вы можете преобразовать его в строку следующим образом:

printf("%d.%d.%d.%d\n",
  int(client.sin_addr.s_addr&0xFF),
  int((client.sin_addr.s_addr&0xFF00)>>8),
  int((client.sin_addr.s_addr&0xFF0000)>>16),
  int((client.sin_addr.s_addr&0xFF000000)>>24));
...