我需要从eth0接口发送多播数据并在Linux机器上的eth1上接收它。
我在C中有2个程序,PROG-1确实setockopt IP_MULTICAST_IF以便它从eth0发送,PROG-2确实加入eth1上的mcast组(用netstat -ng验证)但是在eth1上看不到任何多播流量。我只能在eth0上看到组播数据。我增加了TTL但没有帮助。有没有办法接收eth1上eth0发送的组播?
IP_MULTICAST_LOOP也没有帮助,它只在两个程序在同一个界面上工作时才有效,这对我没用。
它是ipv4上的自定义协议。
发件人代码:
sock_fd = socket( AF_INET, SOCK_RAW, 100 );
srcip = inet_addr("10.1.231.112"); /* src mcast from eth0 */
ret_val = setsockopt( sock_fd,
IPPROTO_IP,
IP_MULTICAST_IF,
&srcip,
sizeof( srcip ));
ttl = 0x2;
ret_val = setsockopt( sock_fd,
IPPROTO_IP,
IP_MULTICAST_TTL,
( char * ) &ttl,
sizeof( ttl ));
dest_addr.sin_addr.s_addr = inet_addr("224.100.1.102");
dest_addr.sin_family = AF_INET;
dest_addr.sin_port = 0;
ret_val = sendto(sock_fd, (char *) buf,
(size_t) 64, 0, /* no flags */
(struct sockaddr *) &dest_addr, addr_len);
收件人代码:
sock_fd = socket( AF_INET, SOCK_RAW, 100 );
mreq.imr_multiaddr.s_addr = inet_addr("224.100.1.102");
mreq.imr_interface.s_addr = inet_addr("10.0.3.15"); /* join on eth1 */
ret_val = setsockopt( sock_fd,
IPPROTO_IP,
IP_ADD_MEMBERSHIP,
( char * ) &mreq,
sizeof( mreq ));
msglen = recvfrom(sock_fd, buf, 4096, 0,
(struct sockaddr*)&addr_struct, &addr_len);
我使用netstat -ng验证了接收者加入了eth1上的组,但发送者发送的消息只能在eth0上看到(eth1上的wireshark不捕获任何内容)。
让我解释我面临的确切问题。我有一个通常在专有硬件上运行的生产代码。这是一个用于网络通信的软件。所有通信都通过多播完成。架构是有一个TX任务,它将组播数据发送到网络中的其他设备,不幸的是,还有一个RX任务也在加入与TX任务发送数据相同的组,因为其他网络设备正在与我的设备通信在同一个播客地址。在生产代码上,我们禁用了多播循环,一切正常,RX任务不接收TX任务发送的内容。现在我们决定在linux机器上运行这个软件进行测试,在同一台机器上我们要运行一个模拟所有其他盒子的软件。我想要实现的目标是" bind"生产代码上的所有mcast套接字到eth0和eth1上的模拟器上。但我不能让他们互相沟通。我可以根据需要配置我的网络接口,添加vlan,接口或任何东西,只是为了让它与另一个进行通信。我无法改变这个软件的架构。
答案 0 :(得分:0)
看看igmpproxy http://sourceforge.net/projects/igmpproxy/ 它在一个接口上接收多播数据包,然后将其广播到指定的其他接口。