我正在尝试在Linux(Ubuntu)上基于我写过的Winsock代码建立一个小型测试应用程序。目前,它只是一个创建套接字的小型测试,看起来成功连接,但却在recv()上永久挂起,而无法接收数据报。它是一个纯阻塞套接字。
以下是我创建它的方式:
一些进一步的测试: - 端口是开放的。 - 其他应用程序能够成功地从多播地址接收数据。显然我忽视了某些东西。非常感谢您的帮助 :-)
我正在尝试在Linux(Ubuntu)上基于我写过的Winsock代码建立一个小型测试应用程序。目前,它只是一个创建套接字的小型测试,看起来成功连接,但却在recv()上永久挂起,而无法接收数据报。它是一个纯阻塞套接字。
以下是我创建它的方式:
一些进一步的测试: - 端口是开放的。 - 其他应用程序能够成功地从多播地址接收数据。在Unix系统中,当使用套接字进行多播时,应该绑定到INADDR_ANY,而不是一个接口。
通过接口进行多播过滤(即仅从指定接口接收mcast)已经就位,因为您正确地填充了imr_interface。
imr_interface
选择通过哪个接口发送 IGMP JOIN,换句话说,哪个子网知道您的成员身份。如果您让它默认,那么您就让静态 IP 路由表决定,这在大多数情况下是正确的。在多主机中,可能需要针对每个接口发出加入请求。 - user207421最后,在进行一些系统配置和故障修复后,问题得到了解决:
a) 以root身份,需要执行以下操作来禁用反向数据包过滤器: echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter + 对于ethX同样适用。
b) 为ethX添加虚假路由(route add -net 224.0.0.0. netmask 224.0.0.0 ethX)
c) 将socket绑定到要加入组的IP地址(否则任何后续的socket都会在该特定端口上接收来自所有已经加入的组的数据包)。
d) 将ip_mreq结构体的接口成员设置为我们正在接收的适配器的IP地址。
然后一切正常,测试运行快速、顺畅(以800-900兆比特的速度拉取125个组播传输流 - 当然这可以更智能,但仍然很好)。感谢提供的所有指导。