Я думаю, это как посмотреть, является ли входящее соединение локального, если у вас есть пир в struct sockaddr_in6
, полученный из getpeername
как так:
struct sockaddr_in6 peer;
socklen_t len = sizeof(peer);
getpeername(sock, (struct sockaddr *) &peer, &len); // todo: error check
Оттуда вы можете заполнить самостоятельно struct sockaddr_in6
с адресом LOCALHOST ::1
и сравнить память для равенства:
struct sockaddr_in6 localhost;
memset(localhost.sin6_addr.s6_addr, 0, 16);
localhost.sin6_addr.s6_addr[15] = 1;
if(memcmp(peer.sin6_addr.s6_addr, localhost.sin6_addr.s6_addr, 16) == 0)
printf("localhost!\n");
Или вы можете создать массив байтов, которые соответствуют с адресом LOCALHOST:
static const unsigned char localhost_bytes[] =
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 };
if(memcmp(peer.sin6_addr.s6_addr, localhost_bytes, 16) == 0)
printf("localhost!\n");
И следите за отображаемым локальным хостом IPv4, ::ffff:127.0.0.1
. Возможно, вам придется это проверить.
static const unsigned char mapped_ipv4_localhost[] =
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff, 0x7f, 0, 0, 1 };
if(memcmp(peer.sin6_addr.s6_addr, mapped_ipv4_localhost, 16) == 0)
printf("mapped IPv4 localhost!\n");
Вопрос неоднозначный. R Samuel Klatchko предположил, что вы имеете в виду «localhost» (:: 1) и Remy Lebeau - TeamB предположил, что вы имеете в виду «локальный хост» (все локальные адреса IPv6). Просьба уточнить. – bortzmeyer