使用相同的套接字发送和接收UDP多播数据包

问题描述 投票:2回答:1

我无法为此找到一个有效的示例,因此我将发布一个问题(让我们看看是否可以将其简化为MVP代码示例)。因此,我需要执行mdns查询,我可以使用两个套接字(一个用于发送,第二个用于接收),但到目前为止,我还无法使它与单个套接字一起使用。

所以我正在执行的步骤是:

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

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

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

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

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

c sockets posix multicast multicastsocket
1个回答
0
投票

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

您需要做的是绑定到INADDR_ANY,然后在设置IP_ADD_MEMBERSHIP选项时,设置要在其上接收多播数据包的接口地址。如果有多个接口,则可以为要绑定到的每个接口调用此接口。

© www.soinside.com 2019 - 2024. All rights reserved.