【问题标题】:How to find the destination address of a UDP packet using boost::asio?如何使用 boost::asio 找到 UDP 数据包的目标地址?
【发布时间】:2013-02-10 22:03:37
【问题描述】:

我正在开发一个点对点通信网络,以便在工业环境中通过 LAN 使用。有些消息只是异步的,不需要响应。其他是请求-响应。请求消息(和异步消息)被发送到一个多播组,并且对请求的回复被单播发送。因此,每个端点都会接收发送到多播组的 UDP 数据包,并且还会接收使用纯单播发送给它的消息。

到目前为止,它工作正常,但在 boost::asio 中似乎没有任何方法可以找出接收到的 UDP 数据包的目标地址(使用 socket.async_receive_from)——它是否被发送到多播组或实际界面。我可以使用消息的内容来推断它是通过多播还是单播发送的,但如果还能够检查目标地址,那就太好了。

我们目前使用的是 Windows 7,但将来会过渡到 Linux。

有没有办法找到使用 boost::asio 接收到的 UDP 数据包的目标地址?

【问题讨论】:

    标签: c++ networking boost udp boost-asio


    【解决方案1】:

    不幸的是,这对于 boost::asio 是不可能的,而且通常不是“实现方式”,因为您尝试通过 Application Layer 访问 Transport Layer 信息。

    所以你基本上有两个选择:

    a) 在 Linux 上使用例如 IP_PKTINFO 或 SO_BINDTODEVICE 编写不可移植的系统代码。示例代码可以在 boost asio 邮件列表中找到 here

    b) 使用两个不同的套接字,一个用于多播,一个用于单播。因此,您需要在每个套接字上指定一个非“0.0.0.0”的listen_address。

    udp::endpoint(address_v4::from_string("239.192.152.143"), 6771)
    

    这个关于 SO 的问题也可能有帮助:Using a specific network interface for a socket in windows

    【讨论】:

    • 谢谢@hannes-m。我想我会选择选项 c) 以这样一种方式编写代码(和消息),使得接收到的消息是多播还是单播都无关紧要。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多