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

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

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

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

Спасибо

34
задан jww 14 June 2017 в 12:26
поделиться

2 ответа

Хорошо, если вы используете 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 );
47
ответ дан 27 November 2019 в 16:05
поделиться

Предположим, что 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));
25
ответ дан 27 November 2019 в 16:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: