2011-05-19 128 views
1

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

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 
    } 
} 

这工作得很好,我测试的计算机上,但计算机只有一个网卡,所以我在想,如果可能,当一台计算机有多个网卡或网络设备,地址 - > h_addr_list [0]可能不是我需要的那个,它可能在该数组的另一个索引中。

[0]总是检索由路由器分配的IP?

+0

不可以。你不能从计算机上知道哪些IP来自哪里;如果电脑同时拥有有线和无线适配器会怎么样?在这种情况下,IP可能来自路由器。 – Joe 2011-05-19 00:37:49

回答

0

(这里假设Winsock的,按照前文的问题)

你不应该假设第一个地址是正确的(因为可能有多个接口,和一个以上的可同时工作)

我建议使用getaddrinfo和空pNodeName参数或GetAdaptersAddresses来枚举地址。

这两个回用系统的注册地址

0

一个链表...获取路由器分配本地内部IP地址...

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

在Linux上,建议使用getaddrinfo(3)而不是gethostbyname(3),也许Winsocks做出了类似的转换?

在Linux上,/etc/hosts环路条目通常也可以通过主机名访问; /etc/gai.conf可用于配置返回地址的排序顺序,并可能会返回一个环回地址。 Winsock是否使系统管理员可以轻松更改返回地址的顺序?

不要忘记的是,系统可以合法具有多个上游路由器:与EV-DO或EDGE或类似蜂窝数据连接无线或有线以太网将具有多个IP地址,多个上游路由器膝上型计算机,和将查询路由表以找出应该使用哪一个来发送每个分组。

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