繁体   English   中英

将对等方的IPv6地址与localhost进行比较

[英]Comparing a peer's IPv6 address with localhost

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

编辑:澄清一下,我的意思是localhost ,就像在环回IP地址中一样。

在IPv6中,环回地址为::1

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

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

我想这是如何看待传入连接是否是localhost,假设你有一个struct sockaddr_in6的对等struct sockaddr_in6 ,从getpeername获得如下:

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

从那里,你可以用localhost地址::1填写你自己的struct sockaddr_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");

或者,您可以创建与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");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM