Подтвердить что ты не робот

Как получить ip-адрес из структуры носка в c?

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

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

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

Спасибо

4b9b3361

Ответ 1

OK, если вы используете 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 );

Ответ 2

Более простым и правильным способом для извлечения 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 не подходит для всех архитектур. См. Большой и Маленький Эндиан.

Ответ 3

Предполагая, что 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));