gpt4 book ai didi

c++ - 多个接口(interface)上的多个多播

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:11:34 24 4
gpt4 key购买 nike

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

我已经对此进行了大量研究,但我找不到真正执行我所拥有的这种设置的任何文章。这是一个非常具体的设置,因此我将尽我所能描述我正在做的事情和我正在尝试做的事情。

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

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

目标是能够启动该程序并收听第一个多播,同时启动该程序的第二个实例以收听另一个多播。该程序本身仅设计为一次收听 1 个多播。

但是我似乎无法同时运行这两个程序。

使用“路由”命令,我已经能够设置路由表,我可以在其中接收其中一个流,但不能接收另一个流。我一次只能打开 1 个流,但不能同时打开两个流。

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

如果我执行路由命令“route add default gw 1​​0.10.20.50 eth0”,我可以很好地接收该地址上的多播

但是一旦我添加“route add default gw 1​​92.168.20.21 eth1”,我就无法再在 10.10.20.50 接口(interface)上接收多播。

我在绑定(bind)套接字或设置 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 结构手动指定接口(interface),并使用 setsockopt 进行 SOL_BINDTODEVICE 设置(eth0 或 eth1),但遇到了与以前相同的问题,如果我有特定路由,我只能让它连接设置...即使这样也只有 1 个会收到,而另一个不会收到。

重申一下......我需要同时运行这个程序的 2 个拷贝......每个拷贝都监听来自特定接口(interface)的自己指定的多播地址。

最佳答案

您需要设置两条不同的路由,以便将不同的组路由到(并因此监听)给定接口(interface):

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 查看哪些组在哪些接口(interface)上收听。

编辑0:

编辑 1:

获取我提到的 UNP 书籍的源代码,它是 here .查看解压后的压缩包中的 unpv13e/lib 目录,读取 mcast_join.c 文件。

关于c++ - 多个接口(interface)上的多个多播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11234671/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com