Полагаю, это как посмотреть, является ли входящее соединение локальным, если предположить, что у вас есть одноранговый узел в 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
адресом локального хоста ::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");