操作系统:CentOS 5.5
语言:C++
我已经对此进行了大量研究,但我真的找不到任何与我所做的精确设置相关的文章。这是一个非常具体的设置,所以我将尽我所能描述我在做什么以及我正在尝试做什么。
我有一台带有 2 个以太网端口(eth0 和 eth1)的计算机。每个人同时接收不同的多播广播。因此,1 个多播 IP 地址和端口将指向 eth0,另一个多播 IP 地址和端口将指向 eth1。
我正在编写一个程序,旨在侦听给定的多播 IP 地址和端口。
目标是能够启动程序并收听 1 个多播,同时启动该程序的第二个实例来收听另一个多播。该程序本身仅设计为一次收听 1 个多播。
但是,我似乎无法同时运行这两个程序。
使用“路由”命令,我已经能够设置路由表,我可以在其中接收 1 个流,但不能接收另一个。我一次只能获得 1 个流,但不能同时进行。
eth0 连接到:10.10.20.50 -- 此接口的多播为 225.0.7.10 端口 51007 eth1 连接到:192.168.20.21 -- 此接口的多播为 225.0.8.10 端口 51008
如果我执行路由命令,“route add default gw 10.10.20.50 eth0”我可以接收到该地址上的多播就好了
但是,一旦我添加“route add default gw 192.168.20.21 eth1”,我就无法再在 10.10.20.50 接口上接收多播。
我在绑定套接字或设置 sockopts 时没有收到任何错误...该程序只是简单地阻塞了 recv 调用并且永远不会收到消息。
我已经尝试了各种路由命令组合来支持这一点,并且我在连接代码中也做了一些不同的事情来解决这个问题,但没有运气。这是我当前的连接代码:
//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 进行 SOL_BINDTODEVICE 设置(eth0 或 eth1),但遇到了与以前相同的问题,如果我有特定的路由设置,我只能连接它。 . 即使这样,也只有 1 会收到,而不会收到其他。
重申……我需要同时运行该程序的 2 个副本……每个副本都在侦听来自特定接口的自己指定的多播地址。