【问题标题】:Windows/Python UDP Broadcast Blocked No FirewallWindows/Python UDP 广播被阻止,没有防火墙
【发布时间】:2017-04-28 11:11:37
【问题描述】:

操作系统:Windows 10

我使用以太网交换机通过 Python 3.4.4 同时将 UDP 数据包发送到另外两个系统(直接连接到同一交换机)。相同的代码适用于另外两台开发/测试 PC,所以我知道它不是 Python 代码,但由于某种原因,它在我希望系统使用的 PC 上不起作用。

当我使用 Wireshark 查看 169.254.255.255(发送 UDP 数据包的目标 IP)处的 UDP 流量时,什么也没有出现。但是,向 169.X.X.1 发送数据包是可行的。另一方面,发送到 169.X.X.255 的数据包已发送,但我收到了超过生存时间的消息作为回报。 我仅限于该目标 IP,因此更改 IP 不是解决方案。我也将它发送到 端口 6000(任意),我尝试更改端口号无济于事。也不让我发送到 169.254.255.1

我已关闭防火墙。

感谢您的帮助。

【问题讨论】:

  • 在此处共享正在使用的 IP 地址是个好主意吗?
  • 这是一个孤立的网络,但我稍微改变了一些细节。感谢您的关心。

标签: windows python-3.x udp broadcast blocked


【解决方案1】:

同样的问题, 解决方案是将套接字绑定到正在发送多播的适配器

示例:

msg = \
    'M-SEARCH * HTTP/1.1\r\n' \
    'HOST:239.255.255.250:1900\r\n' \
    'ST:upnp:rootdevice\r\n' \
    'MX:2\r\n' \
    'MAN:"ssdp:discover"\r\n' \
    'USER-AGENT:Python\r\n\r\n'

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2)
s.bind(('ip of interface',1901))
s.settimeout(10)
print msg,len(msg)
print s.sendto(msg, ('239.255.255.250', 1900) )
resp, (addr, port) = s.recvfrom(1024)
print resp
s.close()

来自这篇帖子的解决方案Can't send multicast over non-default NIC

【讨论】:

  • 您将多播和广播混为一谈,但您的建议是正确的,并解释了为什么它在某些计算机上有效但在其他计算机上无效(这取决于默认适配器是否正确)。此外,当他指定完整地址时它会起作用,因为它不再是广播并绑定到所有地址。
【解决方案2】:

关于我的问题的奇怪之处在于,这个确切的代码以前可以在相关计算机(和两台开发计算机)上运行,但在我发布这个问题时没有运行。

Wireshark 并没有引导我回答(仅显示未发送 UDP 数据包),因此我决定通过命令提示符 ping IP。我收到两个错误之一(目标主机无法访问,或请求超时)。这些错误导致我将所需的目标 IP (169.254.255.255) 添加到 ARP 缓存中,我的问题得到了解决。

感谢您提出可能的解决方案。

【讨论】:

    猜你喜欢
    • 2019-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-05
    • 2014-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多