代码之家  ›  专栏  ›  技术社区  ›  indiv Olivier Poulin

比较对等机的IPv6地址与本地主机

  •  4
  • indiv Olivier Poulin  · 技术社区  · 16 年前

    我已经打电话了 getpeername 在我的已连接套接字上,现在有一个已连接对等机的IPv6地址。如何判断对等机的IP地址是否为localhost?

    编辑:为了澄清,我的意思是 localhost ,在环回IP地址中。

    3 回复  |  直到 15 年前
        1
  •  3
  •   R Samuel Klatchko    16 年前

    在IPv6中,环回地址是 ::1 .

    在二进制级别,即1270,后跟一个1。

        2
  •  3
  •   Remy Lebeau    16 年前

    排除环回地址后,检索本地计算机的当前活动IP列表(计算机可能为不同网络分配了多个IP),然后循环访问该列表,直到找到匹配项。你如何得到这个列表取决于你使用的操作系统。操作系统可能有自己的API(例如,Windows有getadaptersinfo()和相关函数),或者您可以尝试将gethostname()与gethostbyname()或getaddrinfo()一起使用。

        3
  •  3
  •   indiv Olivier Poulin    16 年前

    我想这是如何查看传入连接是否是本地主机的,假设您在 struct sockaddr_in6 ,从 getpeername 像这样:

        struct sockaddr_in6 peer;
        socklen_t len = sizeof(peer);
        getpeername( sock, (struct sockaddr *) &peer, &len); // todo: error check
    

    从那里,你可以填写你自己的 结构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");
    

    或者,您可以创建与本地主机地址对应的字节数组:

        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");