c-使用同一套接字发送和接收UDP多播数据包



我找不到这方面的工作示例,所以我将发布一个问题(让我们看看是否可以将其简化为MVP代码示例(。因此,我需要进行mdns查询,我可以使用两个套接字(一个用于发送,另一个用于接收(,但到目前为止,我还无法使用单个套接字。

因此,我正在执行的步骤是:

枚举主机上的所有接口地址。然后对于每个主机:

  1. 创建非阻塞UDP套接字
  2. bind((到接口地址:5353或多播组地址(这两者中的任何一个都会导致读取或写入失败(
  3. 将IP_MULTICAST_IF设置为本地接口
  4. IP_ADD_MEMBERSHIP到多播组
  5. 在kqueue中添加读/写套接字

因此,根据我在步骤2中所做的操作,读取或写入失败:

  1. 如果我将套接字绑定到多播组,我会从kqueue获得读取通知,并且可以读取数据包,但当我从kqueue获得写入通知并尝试写入时,它失败,错误号为49
  2. 如果我将套接字绑定到接口地址,我可以发送数据包,但从未从kqueue收到读取通知

那么我需要绑定到哪个地址?此外,由于IP_ADD_MEMBERSHIP参数ip_mreq有接口字段,我真的需要IP_MULTICAST_IF吗?

如果绑定到特定的接口地址(至少在Linux上(,将无法接收多播。如果绑定到多播地址,则无法发送。

你需要做的是绑定到INADDR_ANY,然后当你设置IP_ADD_MEMBERSHIP选项时,你就设置了你想在上面接收多播数据包的接口地址。如果你有多个接口,你可以为你想绑定的每个接口调用这个。

最新更新