C 比较同级';具有本地主机的IPv6地址
我已在连接的套接字上调用了C 比较同级';具有本地主机的IPv6地址,c,sockets,ipv6,C,Sockets,Ipv6,我已在连接的套接字上调用了getpeername,现在已拥有连接的对等方的IPv6地址。如何判断对等方的IP地址是否为本地主机 编辑:为了澄清,我的意思是,特别是环回IP地址。在IPv6中,环回地址是::1 在二进制级别,即127 0后跟一个1。排除环回地址后,检索本地计算机的当前活动IP列表(该计算机可能为不同的网络分配了多个IP),然后在该列表中循环,直到找到匹配的IP。如何获得该列表取决于您使用的操作系统。操作系统可能有自己的API(例如,Windows有GetAdapterInfo()和
getpeername
,现在已拥有连接的对等方的IPv6地址。如何判断对等方的IP地址是否为本地主机
编辑:为了澄清,我的意思是,特别是环回IP地址。在IPv6中,环回地址是
::1
在二进制级别,即127 0后跟一个1。排除环回地址后,检索本地计算机的当前活动IP列表(该计算机可能为不同的网络分配了多个IP),然后在该列表中循环,直到找到匹配的IP。如何获得该列表取决于您使用的操作系统。操作系统可能有自己的API(例如,Windows有GetAdapterInfo()和相关函数),或者您可以尝试将gethostname()与gethostbyname()或getaddrinfo()一起使用。我想这就是如何查看传入连接是否为本地主机的方法,假设您在6中的结构sockaddr_中有对等连接,从
getpeername
获取,如下所示:
struct sockaddr_in6 peer;
socklen_t len = sizeof(peer);
getpeername( sock, (struct sockaddr *) &peer, &len); // todo: error check
从那里,您可以用本地主机地址::1
填写自己的结构sockaddr\u 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");
或者,您可以创建与本地主机地址对应的字节数组:
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");
它有时显示为
0:0:0:0:0:0:0:1
而不是::1
的缩写形式。jschmier:正确,但不需要使用文本形式,getpeername返回二进制形式,这是明确的。问题是不明确的。R Samuel Klatchko假定你的意思是“LoalHOST”(:1),ReMeLeBea-TeMeb假定你是指“本地主机”(所有本地IPv6地址)。请澄清。你可能想考虑比较前13个字节来检查IPv4映射的本地主机。(无论如何,在Linux上-如果在127.0.0.0/8网络中ping任何内容,它将被视为localhost
)RFC 3330将整个范围定义为环回: