Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 多接口上的多播_C++_Linux_Networking_Multicast - Fatal编程技术网

C++ 多接口上的多播

C++ 多接口上的多播,c++,linux,networking,multicast,C++,Linux,Networking,Multicast,操作系统:CentOS 5.5 语言:C++ 我已经对此做了很多研究,但我找不到任何文章真正符合我的设置。这是一个非常具体的设置,所以我将尽我所能描述我正在做什么以及我正在尝试做什么 我有一台带有两个以太网端口eth0和eth1的计算机。每个人同时接收不同的多播广播。因此,1个多播IP地址和端口将转到eth0,另一个多播IP地址和端口将转到eth1 我正在编写一个程序,该程序旨在侦听给定的多播IP地址和端口 目标是能够启动程序并侦听其中一个多播,同时启动另一个多播的第二个程序实例。程序本身设计为

操作系统:CentOS 5.5 语言:C++

我已经对此做了很多研究,但我找不到任何文章真正符合我的设置。这是一个非常具体的设置,所以我将尽我所能描述我正在做什么以及我正在尝试做什么

我有一台带有两个以太网端口eth0和eth1的计算机。每个人同时接收不同的多播广播。因此,1个多播IP地址和端口将转到eth0,另一个多播IP地址和端口将转到eth1

我正在编写一个程序,该程序旨在侦听给定的多播IP地址和端口

目标是能够启动程序并侦听其中一个多播,同时启动另一个多播的第二个程序实例。程序本身设计为一次只监听一个多播

然而,我似乎不能让两个程序同时运行

使用route命令,我已经能够设置路由表,在那里我可以接收其中一个流,但不能接收另一个流。我一次只能运行一条流,但不能同时运行两条流

eth0连接到:10.10.20.50-此接口的多播为225.0.7.10端口51007 eth1连接到:192.168.20.21-此接口的多播是225.0.8.10端口51008

如果我执行route命令,route add default gw 10.10.20.50 eth0我就可以很好地接收该地址上的多播

但是,一旦我添加路由添加默认gw 192.168.20.21 eth1,我就无法再在10.10.20.50接口上接收多播

绑定套接字或设置sockopts时,我没有收到任何错误。。。该程序只是简单地阻塞了recv呼叫,从未收到任何消息

我尝试了各种各样的route命令组合来支持这一点,我在我的连接代码中也做了一些不同的事情来修复这一点,但没有成功。以下是我当前的连接代码:

  //Create the UDP socket, check to make sure it was created successfully
  cout << "Initializing Connection..." << endl ;
  m_socket = socket ( AF_INET , SOCK_DGRAM , IPPROTO_UDP ) ;

  if( m_socket == -1 )
  {
    cout << "ERROR CREATING SOCKET: " << strerror(errno) << endl ;
    return false ;
  }

  cout << "Socket Created" << endl;

  //Setup socket binding information
  sockaddr_in addr ;
  bzero  ( ( char* ) &addr , sizeof ( addr ) ) ;
  addr . sin_family       = AF_INET ;
  addr . sin_addr.s_addr  = inet_addr(interface_addr) ; //10.10.20.50 or 192.168.20.21
  addr . sin_port         = htons ( port ) ;            //51007 or 51008

  //bind the socket, check for errors
  int result = bind ( m_socket , ( struct sockaddr* ) &addr , sizeof ( addr ) ) ;

  if ( result == -1 )
  {
    cout << "ERROR BINDING PORT: " << strerror ( errno ) << endl;
    shutdown ( m_socket , SHUT_RDWR ) ;
    return false ;
  }

  cout << "Socket Bound" << endl;

  //subscribe to the supplied IP address and port to listen on
  in_addr host_addr ;
  inet_pton ( AF_INET , ip_addrs . c_str () , & ( host_addr ) ) ;

  struct ip_mreq mreq;
  mreq . imr_multiaddr = host_addr ;       // multicast address 225.0.7.10 or 225.0.8.10
  mreq . imr_interface = addr . sin_addr ; //the 10.10.20.50 or 192.168.20.21 specified above

  result = setsockopt ( m_socket , IPPROTO_IP , IP_ADD_MEMBERSHIP, &mreq , sizeof(mreq) ) ;

  if ( result == -1 )
  {
    cout << "ERROR SETTING SOCKOPT SUBSCRIPTION: " << strerror(errno) << endl ;
    printSocketError();
    shutdown ( m_socket , SHUT_RDWR ) ;
    return false ;
  }

  /*
   * Read from the socket to get the initial bit of information we need so the
   * buffers can get allocated correctly, and the width and height of the application
   * can be defined.
   */
  cout << "Attempting to read from the socket..." << endl;
  MyPacket pckt ;
  recv ( m_socket , &pckt , sizeof ( pckt ) , MSG_PEEK ) ;

  cout << "Data Received... processing" << endl ;
我还尝试使用ip_mreqn结构手动指定接口,并使用setsockopt for SOL_BINDTODEVICE安装程序eth0或eth1,但遇到了与以前相同的问题,我只能在有特定路由设置的情况下让它连接。。。即使这样,也只有一个会收到,而不是另一个


重申。。。我需要同时运行该程序的两个副本。。每个人都在侦听来自特定接口的自己指定的多播地址。

您需要设置两个不同的路由,以便将不同的组路由到给定接口,从而在给定接口上侦听:

root:~# route add -net 225.0.7.10 netmask 255.255.255.255 dev eth0
root:~# route add -net 225.0.8.10 netmask 255.255.255.255 dev eth1
然后,当您的程序运行时,您应该能够看到在netstat-ng的哪个接口上侦听了哪些组

编辑0: 该调用仅适用于TCP,对UDP没有任何意义。 查看第1卷的。它有一章详细介绍了如何正确地做到这一点。这本书中的代码是免费提供的。 编辑1:
获取我提到的UNP书的源代码,它是。查看解包归档文件中的unpv13e/lib目录,读取mcast_join.c文件。

您需要设置两个不同的路由,以便将不同的组路由到给定的接口,从而在该接口上侦听:

root:~# route add -net 225.0.7.10 netmask 255.255.255.255 dev eth0
root:~# route add -net 225.0.8.10 netmask 255.255.255.255 dev eth1
然后,当您的程序运行时,您应该能够看到在netstat-ng的哪个接口上侦听了哪些组

编辑0: 该调用仅适用于TCP,对UDP没有任何意义。 查看第1卷的。它有一章详细介绍了如何正确地做到这一点。这本书中的代码是免费提供的。 编辑1: 获取我提到的UNP书的源代码,它是。查看解包归档文件中的unpv13e/lib目录,阅读mcast_join.c文件。

而是这样做- 1.创建一个类。 2.具有创建和绑定该类中的IP和端口的函数。 3.使用该类对象从主函数调用该函数两次

要验证结果,可以使用命令netstat-g,它将显示与多播IP相对应的两个实例

如果你想我写的话,我可以写,但是你自己先试试

我宁愿这样做- 1.创建一个类。 2.具有创建和绑定该类中的IP和端口的函数。 3.使用该类对象从主函数调用该函数两次

要验证结果,可以使用命令netstat-g,它将显示与多播IP相对应的两个实例


如果你想我写的话,我可以写,但是你自己先试试

尼古拉,谢谢你的回复。我以前确实尝试过执行这些命令,但是当我执行这些命令时,我得到一个网络掩码与路由地址不匹配的错误消息。确认这些命令已成功执行。。。现在我的问题是,我应该绑定到哪个地址?有吗?10.10.20.51/192.168.20.21? 而且我应该怎么做我的袜子?我需要担心SOL_BINDTODEVICE和IP_ADD_成员身份吗?绑定到组地址,不用担心BINDTODEVICE。感谢您的输入Nikolai,仍然有p
有问题。我已经尝试了C++代码中的这些配置:您的路由命令:绑定:192.16820.21/107.20.50端口:51008/51007 Meq:接口192.16820.21/107.20.50地址:225.0.810/225.0.7.10。我也尝试绑定到多播地址,没有成功。该程序仍挂在recv上。我注意到,如果我发送ifconfig,我可以看到程序运行时流量不断增加,并在程序关闭时停止Nikolai,感谢您的回复。我以前确实尝试过执行这些命令,但是当我执行这些命令时,我得到一个网络掩码与路由地址不匹配的错误消息。确认这些命令已成功执行。。。现在我的问题是,我应该绑定到哪个地址?有吗?10.10.20.51/192.168.20.21? 而且我应该怎么做我的袜子?我需要担心SOL_BINDTODEVICE以及IP_ADD_成员身份吗?绑定到组地址,不用担心BINDTODEVICE。感谢您的输入Nikolai,仍然有问题。我已经尝试了C++代码中的这些配置:您的路由命令:绑定:192.16820.21/107.20.50端口:51008/51007 Meq:接口192.16820.21/107.20.50地址:225.0.810/225.0.7.10。我也尝试绑定到多播地址,没有成功。该程序仍挂在recv上。我注意到,如果我发送ifconfig,我可以看到在程序运行时流量不断增加,在程序关闭时停止