1

我正在努力在 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
    }
}

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

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

4

2 回答 2

0

(假设这里是winsock,根据上一个问题)

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

我建议使用getaddrinfopNodeName参数或GetAdaptersAddresses.

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

于 2011-05-19T00:40:03.330 回答
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 of M 个接口会很好,因此用户可以选择哪些网络获得服务,哪些网络不理会。

于 2011-05-19T00:43:54.190 回答