Получение исходного адреса входящего сокетного соединения

У меня есть сервер с входящим сокетом от клиента. Мне нужно получение IP-адреса удаленного клиента. Испытанный поиск Google для in_addr но это немного неприятно. Какие-либо предложения?

19
задан Matthew Murdoch 22 June 2015 в 21:44
поделиться

2 ответа

Поскольку вы говорите, что это входящее соединение от клиента, как альтернатива GetPeername Вы можете просто сохранить адрес, который был возвращен Принять () Вызов, в Вторые и третий параметры.

2
ответ дан 30 November 2019 в 02:24
поделиться

Вам нужна функция getpeername:

// assume s is a connected socket

socklen_t len;
struct sockaddr_storage addr;
char ipstr[INET6_ADDRSTRLEN];
int port;

len = sizeof addr;
getpeername(s, (struct sockaddr*)&addr, &len);

// deal with both IPv4 and IPv6:
if (addr.ss_family == AF_INET) {
    struct sockaddr_in *s = (struct sockaddr_in *)&addr;
    port = ntohs(s->sin_port);
    inet_ntop(AF_INET, &s->sin_addr, ipstr, sizeof ipstr);
} else { // AF_INET6
    struct sockaddr_in6 *s = (struct sockaddr_in6 *)&addr;
    port = ntohs(s->sin6_port);
    inet_ntop(AF_INET6, &s->sin6_addr, ipstr, sizeof ipstr);
}

printf("Peer IP address: %s\n", ipstr);
37
ответ дан 30 November 2019 в 02:24
поделиться
Другие вопросы по тегам:

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