Python - UDP套接字bind()到正确的地址

7 投票
2 回答
14890 浏览
提问于 2025-04-18 02:34

我不明白为什么我这样创建一个套接字

from socket import *
s = socket(AF_INET, SOCK_DGRAM)
s.bind(("192.168.1.10",26000))
print s.recvfrom(4096)[0]

然后我试着发送一个广播包,像这样

from socket import *
s = socket(AF_INET, SOCK_DGRAM)
s.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)
s.sendto("hey!", ("<broadcast>", 26000))

结果不行(在recvfrom()那里卡住了),但是如果我把它绑定到“0.0.0.0”,它就能正确接收到数据包。

我知道“0.0.0.0”意味着所有接口上的每个地址都会在那个端口上监听,但为什么直接绑定到一个特定地址就收不到数据包呢?

操作系统:OSX 10.9.2,Python版本:2.7.6

即使我不是在运行Linux,我还是尝试把套接字绑定到子网的广播地址,结果也是一样。

2 个回答

2

为了监听广播数据包,你需要使用以下内容。

sock.bind(("<broadcast>", port_num))
or
sock.bind(("", port_num))
4

如果你的操作系统是Linux,那么你可以尝试把套接字绑定到子网的广播地址。举个例子,如果你的 ifconfig 设置是 inet addr:192.168.0.62 Bcast:192.168.0.255 Mask:255.255.255.0,那么你就应该把接收套接字绑定到 192.168.0.255。在Linux上,你不能使用你常用的 IP地址

关于这个话题之前有过讨论,详细内容可以查看 这里

撰写回答