我有一个应用程序从同一端口上的多个组播源接收数据.我能够收到数据.但是,我试图考虑每个组的统计数据(即收到的消息,接收的字节数),并且所有数据都混淆了.有谁知道如何解决这个问题?如果我试着查看发件人的地址,那么它不是多播地址,而是发送机器的IP.
我使用以下套接字选项:
struct ip_mreq mreq;
mreq.imr_multiaddr.s_addr = inet_addr("224.1.2.3");
mreq.imr_interface.s_addr = INADDR_ANY;
setsockopt(s, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq));
并且:
setsockopt(s, SOL_SOCKET, SO_REUSEPORT, &reuse, sizeof(reuse));
解决方法:
[编辑澄清bind()实际上可能包含多播地址.]
因此,应用程序正在连接多个多播组,并将发送到其中任何一个的消息接收到同一端口. SO_REUSEPORT允许您将多个套接字绑定到同一端口.除端口外,bind()还需要一个IP地址. INADDR_ANY是一个包罗万象的地址,但也可以使用IP地址,包括多播地址.在这种情况下,只有发送到该IP的数据包才会被传送到套接字.即您可以创建多个套接字,每个多播组一个. bind()每个套接字到(group_addr,port),并加入group_addr.然后,发往不同组的数据将显示在不同的套接字上,您将能够以这种方式区分它.
我测试了以下适用于FreeBSD:
#include
#include
#include
#include
#include
#include