在多个套接字

时间:2016-05-13 23:03:54

标签: c linux sockets udp multicast

我正在运行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来转储接收到的数据包,并确认这些下降是正确的。但是为什么错误的套接字会收到数据包呢?

任何解决方案?

谢谢, 瑶

0 个答案:

没有答案