以前在代码中,遇到组播都是一直绑定0.0.0.0然后去把自己加入到组播组里面去。但是最近的一次改动却让我发现了一个问题。
因为在显示的环境中机器上会有很多网卡(>3)。 而我们指向接收其中一个子网中的组播中的数据,那么很明显的想法就是接收端绑定相应子网的IP。在windows环境中,我们绑定了机器上该子网的IP(例如:172.16.20.40)。实际测试的发现一切良好。然后在Linux环境中沿用了这个code。结果却发现无论如何都收不到组播消息。于是一阵瞎倒腾,发现在linux上绑定在组播组的地址上就可以收到消息。晕,系统不一样表现就是不一样啊。但是事情并没有结束,我并没有弄清楚这是咋回事。查看了公司的包装的代码发现在mutilcast client的实现上是按照Windows的设定来的。
- 创建UDP socket,绑定在一个网卡地址上
- 指定multiast group address,并且取出socket的本地地址,填入ip_mreq.imr_multiaddr和ip_mreq.imr_interface。
而google了一番发现了一个问题,在linux上是不能绑定在物理网卡地址上的,这样做会什么信息都收不到,要么绑定0.0.0.0以收取所有的组播消息,或者绑定一个具体的组播地址以收取发到这个组播地址的消息。而具体要收取哪一个子网的组播信息的时候用ip_mreq.imr_interface来指定。详见(http://stackoverflow.com/questions/11234671/multiple-multicast-on-multiple-interfaces 和http://www.kohala.com/start/mcast.api.txt)
看起来一样的东西在不同的系统下面可能是不一样的,谨记,谨记.