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

标签 python sockets udp bind

我无法理解为什么要以这种方式创建套接字

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() 上)但如果我尝试将它绑定(bind)到“0.0.0.0”,它会正确接收数据包。

我知道 0.0.0.0 意味着每个接口(interface)上的每个地址都将在该端口上监听,但为什么直接绑定(bind)到一个地址会导致它收不到数据包?

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

即使我没有运行 Linux,我还是尝试将套接字绑定(bind)到子网广播地址,结果相同。

最佳答案

如果操作系统是 Linux,则尝试将套接字绑定(bind)到子网广播地址。 例如,如果您的 ifconfig 设置是 inet addr:192.168.0.62 Bcast:192.168.0.255 Mask:255.255.255.0,那么将您的接收器套接字绑定(bind)到 192.168.0.255 。在 Linux 上,您将无法使用常规的 IP address

之前有关于该主题的讨论 here

关于Python - UDP套接字绑定(bind)()到正确的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23042485/

相关文章:

python - 将 JSON 文件转换为具有定义格式的 Dataframe

python - 当其他两个列值匹配时计算列的平均值

python - 无法使用 Python 产生正确的值

c++ - 通过套接字多路复用数据

c# - ReceiveFromAsync 示例

python - 使用 python 从字符串中去除所有空格和引号的最有效方法是什么?

linux - "binding to socket error"后无法终止套接字

ios - 如何在特定接口(interface)上接收 UDP 广播数据包?

java - 如何在简单的UDP服务器中检查发送的消息与接收的消息是否相同

c++ - 读取 boost::asio UDP 广播响应