我正在努力在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?
答案 0 :(得分:0)
(假设winsock在这里,按照前一个问题)
您不应该假设第一个地址是正确的(因为可能有多个接口,并且可能有多个接口处于活动状态)
我建议使用getaddrinfo
空pNodeName
个参数或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接口会很好,因此用户可以选择哪些网络获得服务以及哪些网络不受影响。