是 - > h_addr_list [0]我需要的地址吗?

时间:2011-05-19 00:27:53

标签: c++ ip ip-address router upnp

我正在努力在C ++上实现UpNP,我需要获取路由器分配的本地内部IP地址以使套接字正常工作。我需要的地址是路由器上显示的地址,它显示连接到路由器的计算机和分配给每台计算机的本地IP。我正在使用这个:

PHOSTENT      Addr    = NULL;
char          Host[MAX_PATH];

if( gethostname(Host, sizeof(Host)) == 0 )
{
    Address = gethostbyname( Host );
    if( Address != NULL )
    {
        //*(struct in_addr *)Address->h_addr_list[0]) <- this is my address
    }
}

这在我正在测试的计算机上工作正常,但是该计算机只有一个网卡,所以我想知道当计算机有多个卡或网络设备时,地址 - &gt; h_addr_list [0 ] 可能不是我需要的那个,它可能在该数组的另一个索引中。

[0] 是否会始终检索路由器分配的IP?

2 个答案:

答案 0 :(得分:0)

(假设winsock在这里,按照前一个问题)

您不应该假设第一个地址是正确的(因为可能有多个接口,并且可能有多个接口处于活动状态)

我建议使用getaddrinfopNodeName个参数或GetAdaptersAddresses来枚举地址。

这两个都会返回链接列表和系统的注册地址

答案 1 :(得分:0)

  

...获取路由器分配的本地内部IP地址......

请注意,在某些情况下,将手动分配本机的IP地址,但用户仍希望使用UPnP。

在Linux上,建议使用getaddrinfo(3)代替gethostbyname(3),或许Winsocks也进行了类似的过渡?

在Linux上,/etc/hosts通常也可以通过主机名访问环回条目; /etc/gai.conf可用于配置返回地址的排序顺序,并可能返回环回地址。 Winsock是否使sysadmins更容易更改返回地址的顺序?

不要忘记系统可能合法地拥有多个上游路由器:具有EV-DO或EDGE或类似蜂窝数据连接的笔记本电脑无线或有线以太网将具有多个IP,多个上游路由器,将查询路由表,以确定应该使用哪一个发送每个数据包。

您是否可以使用(a)客户使用的地址与您联系? (getsockname(2)将返回特定套接字上使用的本地地址。)(b)要求用户在IP地址列表中进行选择,如果有多个?绑定到N个M接口会很好,因此用户可以选择哪些网络获得服务以及哪些网络不受影响。