0

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

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

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

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

4

1 回答 1

2

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

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

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

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

于 2013-02-11T06:31:10.410 回答