【问题标题】:Is ->h_addr_list[0] the address I need?->h_addr_list[0] 是我需要的地址吗?
【发布时间】:2011-08-28 11:51:46
【问题描述】:

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

【问题讨论】:

  • 没有。您无法从计算机上分辨出哪些 IP 来自哪里;如果计算机同时具有有线和无线适配器怎么办?在这种情况下,两个 IP 都可能来自路由器。

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


【解决方案1】:

...获取路由器分配的本地内部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 个接口会很好,因此用户可以选择哪些网络获得服务,哪些网络不理会。​​p>

【讨论】:

    【解决方案2】:

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

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

    我建议使用带有空 pNodeName 参数的 getaddrinfoGetAdaptersAddresses 来枚举地址。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-29
      • 1970-01-01
      • 2010-12-13
      • 2021-01-04
      • 2011-11-20
      • 2013-09-04
      相关资源
      最近更新 更多