我想这是如何查看传入连接是否为 localhost,假设您在 struct sockaddr_in6 中有对等点,从 getpeername 获得,如下所示:
struct sockaddr_in6 peer;
socklen_t len = sizeof(peer);
getpeername( sock, (struct sockaddr *) &peer, &len); // todo: error check
从那里,您可以使用本地地址::1 填写您自己的struct sockaddr_in6 并比较内存是否相等:
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");