【问题标题】:Python socket bind 0.0.0.0, inspect incoming messagePython 套接字绑定 0.0.0.0,检查传入消息
【发布时间】:2015-05-26 11:51:01
【问题描述】:

我有一个插座根据:

self.socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.socket.bind(('0.0.0.0', 67)) # Listen on port 67

现在,套接字在端口 67 上侦听所有接口。我等待一些消息:

message, address = self.socket.recvfrom(8192) # Blocking

收到消息后,我想在接收消息的同一接口上的端口 68 上发送广播响应。

问题是:有没有办法检查消息并确定接收消息的网络接口,如果是,我如何发送响应并提供该接口进行传输?

在 Windows 上运行,Python 3.4。

【问题讨论】:

标签: python sockets


【解决方案1】:

你不能。如果您分别绑定到每个 IP 地址(这将为每个接口打开一个套接字),您只能区分接口。

编辑:正如@jweyrich 在下面的 cmets 中指出的那样,在 Windows 上一个名为 IP_PKTINFO(当然是 Linux also)的套接字选项可以提供信息 - 如果它实现了

【讨论】:

  • 你可以,严格来说是 UDP - 见IP_PKTINFO
  • 确实,我的错 - for windows - 只是不确定这是否适用于 Python 的套接字抽象 - 我还没有阅读代码以了解它是否在内部使用 WSARecvMsg
  • OpenBSD 没有,NetBSD 有问题 (mail-index.netbsd.org/tech-net/2013/09/22/msg004252.html),OSX 上次我没有看 (10.7),IOS ??? ....
  • OP 在 Windows 上运行,如果他不关心可移植性,socket 选项可能会解决问题——但我怀疑 Python 的实现确实在 Windows 内部使用了WSARecvMsg
  • @jweyrich,谢谢,我错过了那部分,这实际上是 我的错。如果您不将此作为答案发布,我会在几分钟内更新我自己的答案。
猜你喜欢
  • 2016-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-06
  • 1970-01-01
  • 2016-02-28
  • 1970-01-01
相关资源
最近更新 更多