Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 比较同级';具有本地主机的IPv6地址_C_Sockets_Ipv6 - Fatal编程技术网

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将整个范围定义为环回: