LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: fannyth

UDP的socket绑定到IP地址后无法接受广播数据

[复制链接]
 楼主| 发表于 2005-11-11 13:36:08 | 显示全部楼层
看来我要重新考虑解决我问题的思路;我把问题再说一遍,大家看看有什么好的思路来解决。

由于考虑到我的程序要在多网卡的机器上运行,所以我希望socket既能接受广播的数据又能接受单播的数据。同时在接受广播数据时只接受一次。因为服务器是多网卡的;而我的客户端在启动时还不知道自己的ip地址;所以客户端发送的广播地址是255.255.255.255;所以我想是否可以用两个soket一个用来接受广播,同时自动进行包过虑。另一个用来接受单播数据?不知这样可以吗?会不会有什么影响?
回复 支持 反对

使用道具 举报

发表于 2005-11-11 14:04:30 | 显示全部楼层
Post by fannyth
看来我要重新考虑解决我问题的思路;我把问题再说一遍,大家看看有什么好的思路来解决。

由于考虑到我的程序要在多网卡的机器上运行,所以我希望socket既能接受广播的数据又能接受单播的数据。同时在接受广播数据时只接受一次。因为服务器是多网卡的;而我的客户端在启动时还不知道自己的ip地址;所以客户端发送的广播地址是255.255.255.255;所以我想是否可以用两个soket一个用来接受广播,同时自动进行包过虑。另一个用来接受单播数据?不知这样可以吗?会不会有什么影响?


你可以这样做。

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,使之不能接受以太网广播
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-11-11 16:54:50 | 显示全部楼层
Post by Westwind
你可以这样做。

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,使之不能接受以太网广播



谢谢,你说的很详细了,我可以试试;但我想如果设置另一块网卡不能接受广播数据,是否会对其它程序有影响?所以我想能自己在接受广播数据的同时做一个检测,检测收到的数据是否是指定网卡接受到的如果是则处理,否则丢弃;但不知道如何检测?同时对效率的影响有多大?
回复 支持 反对

使用道具 举报

发表于 2005-11-12 00:27:31 | 显示全部楼层
Post by fannyth
谢谢,你说的很详细了,我可以试试;但我想如果设置另一块网卡不能接受广播数据,是否会对其它程序有影响?所以我想能自己在接受广播数据的同时做一个检测,检测收到的数据是否是指定网卡接受到的如果是则处理,否则丢弃;但不知道如何检测?同时对效率的影响有多大?


这个也有可能,至少存在一个socket api可以返回数据报的目的地址,
recvmsg
recvmsg是非SVR4系统的recv,recvfrom,readv的底层实现,在recvmsg之下就是syscall了。
不过这个函数挺复杂的,你需要学习该函数的用法,并且该函数是不可移植的,至少windows不提供该方法。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表