2009年1月11日星期日

多网卡UDP广播

UDP广播地址:
全网广播地址: 255.255.255.255
组网广播地址: 192.168.0.255 //取决于你的网段

现象:
如果socket绑定到网卡IP地址,这时将收不到广播报文。
如果绑定到INADDR_ANY,这时可以收到广播报文。

分析:
udp广播的递送规则是:
如果没有设置BLOADCASE选项的不递送。
如果bind端口不匹配不递送该套接口
如果绑定的不是INADDR_ANY话
那么必须BIND的地址和目的地址匹配才能递送:
也就是说你必须BIND一个广播地址或者绑定INADDR_ANY
第三
如果你的udp调用了connect
那么源地址和源端口不匹配也不递送
否则递送

解决方法:
可以设置其中一个网卡DISABLE广播能力

多网卡UDP socket广播
可以这样做:
2个udp socket
单播的那个socket bind INADDR_ANY并且设置SO_BROADCAST选项为0,此时他只接受单播数据报
广播那个socket bind 255.255.255.255,并且设置SO_BROADCASE选项为1,此时他只接受UDP广播。
为了防止接收到同一个广播的2分copy,如果两个网卡位于同一个子网,那么就用ifconfig命令disable其中一块网卡的BROADCAST标志,让其不能接受以太网广播。
你也可以使用ioctl的SIOCSIFFLAGS方法去掉一个接口的标志IFF_BROADCAST,使之不能接受以太网广播

没有评论: