linux多播加入不';t、 为什么??

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

我需要在一个以太网连接上接收来自两个源的多播数据,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的连接显然已被第二个套接字的设置删除。
如何在单个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.