linux多播加入不';t、 为什么??
我需要在一个以太网连接上接收来自两个源的多播数据,224.0.31.132端口14384和224.0.31.130端口14382。 首先我尝试绑定端口14384,然后加入两个ip地址,但我只从224.0.31.132获取数据。 如果我绑定14382并将两者连接起来,那么我只能从224.0.31.130获取数据。 然后我尝试创建两个套接字,将第一个绑定到14384并连接224.0.31.132,然后将第二个绑定到14382并连接224.0.31.130。 当我这样做时,我从224.0.31.130获取数据,但不是从224.0.31.132获取数据,ip maddr show显示,到224.0.31.132的连接显然已被第二个套接字的设置删除。linux多播加入不';t、 为什么??,linux,multicast,Linux,Multicast,我需要在一个以太网连接上接收来自两个源的多播数据,224.0.31.132端口14384和224.0.31.130端口14382。 首先我尝试绑定端口14384,然后加入两个ip地址,但我只从224.0.31.132获取数据。 如果我绑定14382并将两者连接起来,那么我只能从224.0.31.130获取数据。 然后我尝试创建两个套接字,将第一个绑定到14384并连接224.0.31.132,然后将第二个绑定到14382并连接224.0.31.130。 当我这样做时,我从224.0.31.130
如何在单个eth端口上接收来自这两个源的数据 以下是第一种方法的代码:
/* Create a datagram socket on which to receive. */
int sd = socket(AF_INET, SOCK_DGRAM, 0);
if(sd < 0)
{
perror("Opening datagram socket error");
exit(1);
}
else
cout<<"Opening datagram socket....OK."<<endl;
/* Enable SO_REUSEADDR to allow other */
/* applications to receive copies of the multicast datagrams. */
{
int reuse = 1;
if(setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, (char *)&reuse, sizeof(reuse)) < 0)
{
perror("Setting SO_REUSEADDR error");
close(sd);
exit(1);
}
else
cout<<"Setting SO_REUSEADDR...OK."<<endl;
}
/* Enable SO_REUSEPORT to allow multiple uses of receive port */
{
int reuse = 1;
if(setsockopt(sd, SOL_SOCKET, SO_REUSEPORT, (char *)&reuse, sizeof(reuse)) < 0)
{
perror("Setting SO_REUSEPORT error");
close(sd);
exit(1);
}
else
cout<<"Setting SO_REUSEPORT...OK."<<endl;
}
/* Bind to the proper port number with the IP address */
/* specified as INADDR_ANY. */
struct sockaddr_in localSock;
memset((char *) &localSock, 0, sizeof(localSock));
localSock.sin_family = AF_INET;
localSock.sin_port = htons(14384);
localSock.sin_addr.s_addr = INADDR_ANY;
if(bind(sd, (struct sockaddr*)&localSock, sizeof(localSock)))
{
perror("Binding datagram socket error");
close(sd);
exit(1);
}
else
cout<<"Binding datagram socket...OK."<<endl;
/* Join the multicast groups on the local nic interface. */
struct ip_mreq group;
group.imr_interface.s_addr = inet_addr("0.0.0.0");
int ipcount = stoi(getSetup("mcstcount"));
while(ipcount>0)
{
string which = "listenip" + to_string(ipcount);
cout<<"listen to "<<getSetup(which.c_str())<<endl;
group.imr_multiaddr.s_addr = inet_addr(getSetup(which.c_str()).c_str());
ipcount--;
if(setsockopt(sd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&group, sizeof(group)) < 0)
{
perror("Adding multicast group error");
close(sd);
exit(1);
}
else
cout<<"Adding multicast group...OK."<<endl;
}
// process Mdp feed
while( !stop_cond )
{
/* Read from the socket. */
const int DBUFSZ = 5000;
uint8_t databuf[DBUFSZ];
int datalen;
datalen=read(sd, databuf, DBUFSZ);
if(datalen < 0)
{
perror("Reading datagram message error");
close(sd);
exit(1);
}
//process data
}
但数据仅来自224.0.31.132 结论是不能使用单个套接字,因为有多个端口可从中接收。返回到方法二,使用多个套接字。让它工作,不确定第一次出了什么问题
Opening datagram socket....OK.
Setting SO_REUSEADDR...OK.
Setting SO_REUSEPORT...OK.
Binding datagram socket...OK.
listen to 224.0.33.80
Adding multicast group...OK.
listen to 224.0.31.130
Adding multicast group...OK.
listen to 224.0.31.132
Adding multicast group...OK.