4

我已经调用getpeername了已连接的套接字,现在有了已连接对等方的 IPv6 地址。如何判断我的对等方的 IP 地址是否为 localhost?

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

4

3 回答 3

3

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

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

于 2010-05-18T23:42:16.513 回答
3

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

于 2010-05-19T02:25:13.283 回答
3

我想这是如何查看传入连接是否是本地主机,假设您在 a 中有对等点struct sockaddr_in6,从getpeername如下获得:

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

struct sockaddr_in6从那里,您可以使用 localhost 地址填写您自己的地址::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");
于 2010-05-19T18:04:09.283 回答