UDP套接字(多播)不接收数据(Ubuntu)

时间:2014-02-03 15:00:04

标签: c++ sockets ubuntu

我正在尝试在Linux(Ubuntu)上基于我为Winsock编写的(并且有效的)代码设置一个小测试应用程序。就目前而言,它只是一个小测试,创建一个套接字(并且看似成功连接)只是永久挂在recv()而不是接收数据报。这是一个普通的阻塞插座。

以下是我创建它的方法:

http://pastebin.com/kcCbgxbB

进一步测试了一些事情: - 港口开放。 - 其他应用程序能够成功从多播地址接收数据。

显然我忽略了一些东西。非常感谢: - )

2 个答案:

答案 0 :(得分:5)

在Unix系统中,当使用套接字进行多播时,你应该绑定到INADDR_ANY,而不是绑定到接口。

通过接口进行多播过滤(即不从指定接口以外的其他接口接收mcast)已经到位,因为您正确填写了imr_interface。

答案 1 :(得分:3)

所以,最后一点点系统配置和错误修正都有很长的路要走:

a)作为root用户,我必须执行以下操作来禁用反向数据包过滤器: echo 0>的/ proc / SYS /网/的IPv4 / conf目录/所有/ rp_filter + ethX也一样。

b)为ethX添加虚假路由(route add -net 224.0.0.0.netmask 224.0.0.0 ethX)

c)将套接字绑定到待加入组的IP(否则任何后续套接字都会从我在该特定端口上加入的所有组中获取所有数据包)。

d)将ip_mreq结构的接口成员设置为我们正在接收的适配器的IP。

然后一切都很好,花花公子,测试运行快速&平滑(在800-900 mbit左右拉动125个多播传输流 - 确保这可以更聪明,但仍然如此)。感谢所有的指示。