【问题标题】:Get IP address of Interface for a UDP socket when it is bound to INADDR_ANY [duplicate]当绑定到 INADDR_ANY 时,获取 UDP 套接字的接口 IP 地址 [重复]
【发布时间】:2020-01-03 07:11:18
【问题描述】:

当我们将一个 UDP 服务器套接字(Ip / 端口)绑定到一个特殊的 IP 地址 INADDR_ANY - 系统中所有可用的接口都将用于端口 PORT。

现在实际上我需要在客户端连接时找到接口的 MTU - 所以我需要找到客户端连接到的接口详细信息。

我尝试使用getsockname API,但它返回“0.0.0.0”。如何获取客户端连接的接口的实际 IP?

【问题讨论】:

  • 你无法从套接字中获取它,因为套接字没有一个,也没有“客户端连接”。但是,如果您的系统支持它,您可能能够获取传入 数据报的目标地址,
  • 您可以枚举所有可用的接口,获取每个接口的 MTU,然后使用一个看起来合适的接口(可能是最小的接口,具体取决于您的用例)。

标签: c++ linux networking udp


【解决方案1】:

UDP 中没有连接,这就是为什么你不能以你想要的方式使用getsockname()

如果想知道绑定到INADDR_ANY时哪个接口接收到每个数据报,可以在socket上启用IP_PKTINFO选项,然后使用recvmsg()而不是recvfrom()来读取数据报。 recvmsg() 在输出中填充的 msghdr 结构可用于确定接收接口。有关详细信息,请参阅cmsg macros

Get destination address of a received UDP packet

【讨论】:

    猜你喜欢
    • 2023-02-12
    • 1970-01-01
    • 2017-10-17
    • 2014-05-27
    • 1970-01-01
    • 2014-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多