我有以下代码,它发送在子网中广播的udp
数据包。
from socket import *
s=socket(AF_INET, SOCK_DGRAM)
s.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)
s.sendto('this is testing',('255.255.255.255',12345))
以下代码用于接收广播包。
from socket import *
s=socket(AF_INET, SOCK_DGRAM)
s.bind(('172.30.102.141',12345))
m=s.recvfrom(1024)
print m[0]
问题是它没有接收到任何广播包。但是,它正在成功地接收发送到该端口的普通udp数据包。
显然,我的机器正在接收广播包,我使用netcat
对其进行了测试。
$ netcat -lu -p 12345
this is testing^C
那么,问题到底出在哪里?
我相信,公认的答案中概述的解决办法解决了这个问题,但并不完全正确。您不应该使用普通的接口IP,而是用于发送消息的广播IP。例如,如果ifconfig是:
inet addr:10.0.2.2 Bcast:10.0.2.255 Mask:255.255.255.0
那么服务器应该使用 s、 绑定('10.0.2.255',12345)),而不是10.0.2.2(在OP的情况下,他应该使用255.255.255.255)。 接受的答案之所以有效,是因为“”告诉服务器接受来自所有地址的数据包,同时指定IP地址,并对其进行筛选。
”是锤子,指定正确的广播地址是手术刀。在许多情况下,虽然可能不是OP,但重要的是服务器只监听指定的IP地址(例如,您只想接受来自专用网络的请求-上面的代码也会接受来自任何外部网络的请求),以达到安全目的。
尝试绑定到默认地址:
相关问题 更多 >
编程相关推荐