我在已连接的套接字上调用了getpeername
,现在拥有连接对等体的IPv6地址。如何判断对等方的IP地址是否为localhost?
编辑:澄清一下,我的意思是localhost,就像环回IP地址一样。
答案 0 :(得分:3)
在IPv6中,环回地址为::1
。
在二进制级别,即127 0后跟单个1。
答案 1 :(得分:3)
在排除环回地址后,检索本地计算机的当前活动IP列表(计算机可能为不同的网络分配了多个IP),然后循环遍历该列表,直到找到匹配项。实际获得该列表的方式取决于您使用的操作系统。操作系统可能有自己的API(例如,Windows具有GetAdaptersInfo()和相关功能),或者您可以尝试将gethostname()与gethostbyname()或getaddrinfo()一起使用。
答案 2 :(得分:3)
我想这是如何查看传入连接是否为localhost,假设您有struct sockaddr_in6
中的对等方,从getpeername
获取,如此:
struct sockaddr_in6 peer;
socklen_t len = sizeof(peer);
getpeername( sock, (struct sockaddr *) &peer, &len); // todo: error check
从那里,您可以使用localhost地址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 localhost ::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");