如何从 udp-socket (C/C) 获取您自己的(本地)IP 地址

新手上路,请多包涵
  1. 您有多个网络适配器。
  2. 将 UDP 套接字绑定到本地端口,而不指定地址。
  3. 在其中一个适配器上接收数据包。

你如何获得接收数据包的适配器的本地 IP 地址?

问题是,“接收适配器的 IP 地址是什么?”不是我们从发件人那里得到的地址

receive_from( ..., &senderAddr, ... );

称呼。

原文由 Christopher 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

您可以枚举所有网络适配器,获取它们的 IP 地址,并将子网掩码覆盖的部分与发送者的地址进行比较。

喜欢:

 IPAddress FindLocalIPAddressOfIncomingPacket( senderAddr )
{
    foreach( adapter in EnumAllNetworkAdapters() )
    {
        adapterSubnet = adapter.subnetmask & adapter.ipaddress;
        senderSubnet = adapter.subnetmask & senderAddr;
        if( adapterSubnet == senderSubnet )
        {
            return adapter.ipaddress;
        }
    }
}

原文由 Timbo 发布,翻译遵循 CC BY-SA 2.5 许可协议

timbo 提供的解决方案假设地址范围是唯一的并且不重叠。虽然这通常是这种情况,但它不是一个通用的解决方案。

在 Steven 的书“Unix 网络编程”(第 20.2 节)中提供了一个很好的函数实现,它是基于 recvmsg() 而不是 recvfrom() 的函数。如果您的套接字启用了 IP_RECVIF 选项,则 recvmsg() 将返回接收数据包的接口的索引。然后可以使用它来查找目标地址。

源代码可 在此处 获得。有问题的函数是’recvfrom_flags()’

原文由 Andrew Edgecombe 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏