使用相同的套接字发送和接收 UDP 多播数据包
Send and receive UDP multicast packets with the same socket
我找不到适用于此的示例,所以我要 post 一个问题(让我们看看是否可以将其简化为 MVP 代码示例)。所以,我需要做 mdns 查询,我可以使用两个套接字(一个用于发送/第二个用于接收)但是到目前为止我还不能让它与一个套接字一起工作。
所以我执行的步骤是:
枚举主机上的所有接口地址。然后对于每个主机:
- 创建非阻塞 UDP 套接字
- bind() 到接口 address:5353 或多播组地址(其中任何一个都会导致读取或写入失败)
- 设置IP_MULTICAST_IF为本地接口
- IP_ADD_MEMBERSHIP到组播组
- 在 kqueue
中添加 read/write 的套接字
因此,取决于我在第 2 步中执行的操作,读取或写入失败:
- 如果我将套接字绑定到多播组,我会从 kqueue 收到读取通知并可以读取数据包,但是当我从 kqueue 收到写入通知并尝试写入时,它会失败并显示 errno 49
- 如果我将套接字绑定到接口地址,我可以发送数据包,但不会收到来自 kqueue 的读取通知
那么我需要绑定到哪个地址呢?此外,由于 IP_ADD_MEMBERSHIP
参数 ip_mreq
具有接口字段,我真的需要 IP_MULTICAST_IF
吗?
如果您绑定到特定接口地址(至少在 Linux 上),您将无法接收多播。如果绑定到多播地址,则无法发送。
你需要做的是绑定到INADDR_ANY
,然后当你设置IP_ADD_MEMBERSHIP
选项时,你设置了你想要接收多播数据包的接口地址。如果你有多个接口,你可以为每个你想绑定的接口调用它。
我找不到适用于此的示例,所以我要 post 一个问题(让我们看看是否可以将其简化为 MVP 代码示例)。所以,我需要做 mdns 查询,我可以使用两个套接字(一个用于发送/第二个用于接收)但是到目前为止我还不能让它与一个套接字一起工作。
所以我执行的步骤是:
枚举主机上的所有接口地址。然后对于每个主机:
- 创建非阻塞 UDP 套接字
- bind() 到接口 address:5353 或多播组地址(其中任何一个都会导致读取或写入失败)
- 设置IP_MULTICAST_IF为本地接口
- IP_ADD_MEMBERSHIP到组播组
- 在 kqueue 中添加 read/write 的套接字
因此,取决于我在第 2 步中执行的操作,读取或写入失败:
- 如果我将套接字绑定到多播组,我会从 kqueue 收到读取通知并可以读取数据包,但是当我从 kqueue 收到写入通知并尝试写入时,它会失败并显示 errno 49
- 如果我将套接字绑定到接口地址,我可以发送数据包,但不会收到来自 kqueue 的读取通知
那么我需要绑定到哪个地址呢?此外,由于 IP_ADD_MEMBERSHIP
参数 ip_mreq
具有接口字段,我真的需要 IP_MULTICAST_IF
吗?
如果您绑定到特定接口地址(至少在 Linux 上),您将无法接收多播。如果绑定到多播地址,则无法发送。
你需要做的是绑定到INADDR_ANY
,然后当你设置IP_ADD_MEMBERSHIP
选项时,你设置了你想要接收多播数据包的接口地址。如果你有多个接口,你可以为每个你想绑定的接口调用它。