2013-02-10 84 views
0

我正在开发一个在工业环境中通过局域网使用的点对点通信网络。有些消息只是异步的,不需要响应。其他则是请求 - 回应。请求消息(和异步消息)被发送到多播组,并且对请求的回复以单播方式发送。因此,每个端点接收发送到多播组的UDP数据包,并且还接收使用普通单播发送给它的消息。如何使用boost :: asio查找UDP数据包的目标地址?

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

我们目前正在使用Windows 7,但未来将会过渡到Linux。

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

回答

2

不幸的是,对于boost :: asio来说这是不可能的,而且通常不是“这样做”的方法,因为您试图访问Application Layer上的Transport Layer信息。

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

a)写出与非便携式系统的代码,例如IP_PKTINFO或SO_BINDTODEVICE在Linux上。示例代码可以在boost asio邮件列表中找到here

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

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

在这个问题上也是如此可能会有所帮助:Using a specific network interface for a socket in windows

+0

感谢@汉内斯·米。我想我会选择选项c)编写代码(和消息),以便消息是接收多播还是单播都无关紧要。 – cdjc 2013-02-12 01:00:01

相关问题