Archive

Posts Tagged ‘socket’

组播的时候到底该如何绑定网卡

August 2nd, 2012 No comments

  以前在代码中,遇到组播都是一直绑定0.0.0.0然后去把自己加入到组播组里面去。但是最近的一次改动却让我发现了一个问题。

因为在显示的环境中机器上会有很多网卡(>3)。 而我们指向接收其中一个子网中的组播中的数据,那么很明显的想法就是接收端绑定相应子网的IP。在windows环境中,我们绑定了机器上该子网的IP(例如:172.16.20.40)。实际测试的发现一切良好。然后在Linux环境中沿用了这个code。结果却发现无论如何都收不到组播消息。于是一阵瞎倒腾,发现在linux上绑定在组播组的地址上就可以收到消息。晕,系统不一样表现就是不一样啊。但是事情并没有结束,我并没有弄清楚这是咋回事。查看了公司的包装的代码发现在mutilcast client的实现上是按照Windows的设定来的。

  1. 创建UDP socket,绑定在一个网卡地址上
  2. 指定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

  看起来一样的东西在不同的系统下面可能是不一样的,谨记,谨记.

Categories: programming Tags: ,

一个关于UDP数据发送错误的问题

March 8th, 2012 No comments

  为了能支持新项目的DMSCC和LSCP协议,决定增加UDP的功能。加上以前在系统上使用的是IOCP(win)/epoll(linux),所以新增加的UDP也尽量向采用这个机制,同时沿用以前的框架,那么外部对于socket server的使用基本保持一致。

  完成代码以后测试的时候发现了一个问题,就是经过一段时间的测试以后,UDP server就不在接收数据了。检查日志的时候发现原来是UDP server socket收到了一个报错,而我之前很蠢的认为如果udp server socket报错就代表这个socket不可再用了。后来才明白这个错误是因为server socket尝试发送一个udp数据包到client的时候因为client可以能已经关闭了socket,或者其他的原因造成数据包不可到达。这个时候系统会收到一个ICMP消息告知主机消息不可达。而这个时候IOCP就会告知说出现一个错误(在windows上错误码是1234)。当收到这个错误告知以后,再次调用WSARecvFrom即可继续接收新的udp消息。

udp 数据包不可达,收到一个ICMP消息

Categories: programming Tags: ,