我正在运行Ubuntu 14.04。我有一个包含2个线程的进程。第一个线程通过lo接口发送5个UDP数据包,每个数据包具有不同的mcast dst地址:224.0.24.10,239.255.1.1,239.255.1.2,239.255.1.3,239.255.1.4。这些数据包具有相同的dport = 60000。
第二个线程创建5个套接字并尝试接收这些mcast数据包。它看起来像这样:
int sd;
struct sockaddr_in sock;
struct ip_mreq group;
int reuse = 1;
sd = socket(AF_INET, SOCK_DGRAM, 0);
setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, (char *)&reuse, sizeof(reuse));
bzero((char *)&sock, sizeof(sock));
sock.sin_family = AF_INET;
sock.sin_port = htons(60000);
sock.sin_addr.s_addr = INADDR_ANY;
bind(sd, (struct sockaddr*)&sock, sizeof(sock));
group.imr_multiaddr.s_addr = dip;
group.imr_interface.s_addr = ((struct sockaddr_in *)(&(ifr.ifr_addr)))->sin_addr.s_addr; //This is the IP of lo: 127.0.0.1
setsockopt(sd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&group, sizeof(group));
我遗漏了上面代码示例中的所有错误检查。我在我的真实代码中有它们。
基本上,上面的代码是一个被调用5次的函数,每次调用都有不同的下降。然后将创建的sd设置为fd_set,其中select()用于从所有5个套接字接收。
我看到的是与224.0.24.10关联的套接字接收到正确的数据包。
但其他4个套接字接收所有数据包到239.255.1。*。例如,与239.255.1.1关联的套接字应仅接收dip = 239.255.1.1的数据包。但它接收的数据包为dip = 239.255.1.1 - 239.255.1.4。
我打开了IP_PKTINFO并使用in_pktinfo来转储接收到的数据包,并确认这些下降是正确的。但是为什么错误的套接字会收到数据包呢?
任何解决方案?
谢谢, 瑶