当前位置: 技术问答>linux和unix
Linux 加入多个组播, 并绑定同一个端口时问题
来源: 互联网 发布时间:2016-07-30
本文导语: 当我们的程序需要加入不同的组播,但在同一端口上接收数据时,套接字之间的数据会出现"窜线"现象 如加入 225.0.0.10:5000和225.0.0.11:5000, 按理说,第一个套接字只能接收到网络中发往"225.0.0.10"和端口5000的数据, 第二个...
当我们的程序需要加入不同的组播,但在同一端口上接收数据时,套接字之间的数据会出现"窜线"现象
如加入 225.0.0.10:5000和225.0.0.11:5000, 按理说,第一个套接字只能接收到网络中发往"225.0.0.10"和端口5000的数据,
第二个套接字只能接收网络中发往"225.0.0.11"和端口5000的的数据,但在Linux(SuSE)上,却没有看到期望的结果,此时两个
套接字都可以互相接收到对方的数据,而Windows上不会出现此现象.能否说这是Linux内核TCP/IP协议的实现有BUG?
解决办法简单:
除了加入多播组 ,还需要绑定此组播IP到自身的套接字上,如:
...
struct sockaddr_in addr;
addr.sin_addr.s_addr = inet_addr("225.0.0.10");
bind(s, (sockaddr*)&addr, sizeof(struct sockaddr));
...
//add multicast
...
如加入 225.0.0.10:5000和225.0.0.11:5000, 按理说,第一个套接字只能接收到网络中发往"225.0.0.10"和端口5000的数据,
第二个套接字只能接收网络中发往"225.0.0.11"和端口5000的的数据,但在Linux(SuSE)上,却没有看到期望的结果,此时两个
套接字都可以互相接收到对方的数据,而Windows上不会出现此现象.能否说这是Linux内核TCP/IP协议的实现有BUG?
解决办法简单:
除了加入多播组 ,还需要绑定此组播IP到自身的套接字上,如:
...
struct sockaddr_in addr;
addr.sin_addr.s_addr = inet_addr("225.0.0.10");
bind(s, (sockaddr*)&addr, sizeof(struct sockaddr));
...
//add multicast
...
|
其实单播也一样, 你用INADDR_ANY:5000绑定一个socket, 如果你的机器有两个网卡,IP分别为192.168.1.1, 192.168.1.2, 那么不管是发往192.168.1.1:5000还是 192.168.1.2:5000,你的程序都可以收到. 一个道理
|
怀疑lz以前绑定ip时绑的是127.0.0.1 或者INADDR_ANY