我找不到可行的示例,所以我要发布一个问题(让我们看看是否可以将其简化为MVP代码示例)。因此,我需要执行mdns查询,可以使用两个套接字(一个用于发送/第二个用于接收),但是到目前为止,我尚未能够使其与单个套接字配合使用。
因此,我执行的步骤如下:
1. 枚举主机上的所有接口地址。然后对于每个主机: 2. 创建非阻塞UDP套接字。 3. bind() 到接口地址:5353或组播组地址(这两个中的任何一个会导致读取或写入失败)。 4. 将IP_MULTICAST_IF设置为本地接口。 5. 加入多播组的IP_ADD_MEMBERSHIP。 6. 将套接字添加到kqueue的读/写集合中。
因此,根据我在第2步中执行的操作,要么读取失败,要么写入失败:
1. 如果我将套接字绑定到多播组,则会从kqueue获得读取通知并可以读取数据包,但当我从kqueue获取写入通知并尝试写入时,它会失败,并显示errno 49。 2. 如果我将套接字绑定到接口地址,则可以发送数据包,但从未收到来自kqueue的读取通知。
那么我需要绑定到哪个地址呢?另外,由于IP_ADD_MEMBERSHIP参数ip_mreq具有接口字段,我真的需要IP_MULTICAST_IF吗?
因此,我执行的步骤如下:
1. 枚举主机上的所有接口地址。然后对于每个主机: 2. 创建非阻塞UDP套接字。 3. bind() 到接口地址:5353或组播组地址(这两个中的任何一个会导致读取或写入失败)。 4. 将IP_MULTICAST_IF设置为本地接口。 5. 加入多播组的IP_ADD_MEMBERSHIP。 6. 将套接字添加到kqueue的读/写集合中。
因此,根据我在第2步中执行的操作,要么读取失败,要么写入失败:
1. 如果我将套接字绑定到多播组,则会从kqueue获得读取通知并可以读取数据包,但当我从kqueue获取写入通知并尝试写入时,它会失败,并显示errno 49。 2. 如果我将套接字绑定到接口地址,则可以发送数据包,但从未收到来自kqueue的读取通知。
那么我需要绑定到哪个地址呢?另外,由于IP_ADD_MEMBERSHIP参数ip_mreq具有接口字段,我真的需要IP_MULTICAST_IF吗?
IP_ADD_MEMBERSHIP
调用,每个接口调用一次。 - dbush