- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我需要从 eth0 接口(interface)发送多播数据并在 Linux 机器上的 eth1 上接收它。我在 C 中有 2 个程序,PROG-1 执行 setsockopt IP_MULTICAST_IF 以便它从 eth0 发送,PROG-2 确实加入了 eth1 上的 mcast 组(使用 netstat -ng 验证)但在 eth1 上看不到任何多播流量。我只能在 eth0 上看到多播数据。我增加了 TTL 但没有帮助。有什么办法可以在eth1上接收eth0发送的多播吗?
IP_MULTICAST_LOOP 也没有帮助,只有当两个程序在同一接口(interface)上工作时它才有效,这对我没有好处。
这是基于 ipv4 的自定义协议(protocol)。
发件人代码:
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 任务发送数据相同的组,因为其他网络设备正在与我的设备通信在同一个 mcast 地址上。在生产代码中,我们禁用了多播循环,一切正常,RX 任务没有收到 TX 任务发送的内容。现在我们决定在 linux 机器上运行该软件以进行测试,我们希望在同一台机器上运行模拟所有其他机器的软件。我想要完成的是将生产代码上的所有 mcast 套接字“绑定(bind)”到 eth0 和 eth1 上的模拟器。但我不能让他们互相交流。我可以根据需要配置我的网络接口(interface),添加 vlan、接口(interface)或任何东西,只是为了使其相互通信。我不能做的是改变这个软件的架构。
最佳答案
看看 igmpproxy http://sourceforge.net/projects/igmpproxy/它在一个接口(interface)上接收组播数据包,然后将其广播到指定的其他接口(interface)。
关于c - 从 eth0 向 eth1 发送多播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24438903/
我是一名优秀的程序员,十分优秀!