我正在开发一个点对点通信网络,以便在工业环境中的LAN上使用。有些消息只是异步的,不需要响应。其他是请求 - 响应。请求消息(和异步消息)被发送到多播组,并且对请求的回复是单播发送的。因此,每个端点都接收发送到组播组的UDP数据包,并接收使用普通单播发送给它的消息。
到目前为止,它工作正常,但似乎没有任何方法在boost :: asio中查找收到的UDP数据包的目标地址(使用socket.async_receive_from) - 是否已将其发送到多播组或实际的界面。我可以使用消息的内容来推断它是发送多播还是单播,但是能够检查目标地址会很好。
我们目前正在使用Windows 7,但将来会转换到Linux。
有没有办法找到使用boost :: asio接收的UDP数据包的目标地址?
答案 0 :(得分:2)
不幸的是,使用boost :: asio是不可能的,而且通常不是"这样做的方式"它,当您尝试访问Transport Layer时的Application 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