【问题标题】:Python - UDP socket bind() to the correct addressPython - UDP套接字绑定()到正确的地址
【发布时间】:2014-05-27 08:58:01
【问题描述】:

我不明白为什么要以这种方式创建套接字

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,我也尝试将套接字绑定到子网广播地址,结果相同。

【问题讨论】:

  • 您使用哪种操作系统?您是否尝试过类似wireshark 的方法来查看广播时通过接口发送了哪些消息?
  • 什么操作系统?如果是 Linux 似乎非 root 是不可能的github.com/netty/netty/issues/576 你需要使用 0.0.0.0 或者只是一个单独的套接字
  • 您可以尝试绑定到子网广播地址(例如 192.168.1.255,取决于您的设置),正如这里所说的 stackoverflow.com/questions/13666789/…
  • socket() 函数接受三个参数,我认为第三个在任何情况下都不是可选的。
  • 并注意端口号。它们应始终包含在htons() 中,以便您在代码中看到实际的端口号,而不是字节顺序颠倒的数字。

标签: python sockets udp bind


【解决方案1】:

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

之前有讨论过here这个话题

【讨论】:

    猜你喜欢
    • 2023-02-12
    • 1970-01-01
    • 1970-01-01
    • 2016-12-22
    • 2012-06-15
    • 2016-09-22
    • 1970-01-01
    • 2015-12-25
    • 2021-05-21
    相关资源
    最近更新 更多