【问题标题】:Python2 socket.recvfrom() / recv() differences between LInux and Windows?Python2 socket.recvfrom() / recv() LINux 和 Windows 的区别?
【发布时间】:2021-08-07 04:05:48
【问题描述】:

通过调用bind() 并接收recvfrom() 的消息,我可以在Ubuntu 20.04 中成功接收数据包。但是,切换到 Windows 似乎打破了这一点。清除防火墙问题后,我可以在 Python 3.9 中成功接收数据包,但我仍然无法在 Python 2.7 中接收它(这是我当前程序正在使用的)。在 Python 2.7 中运行时,它似乎挂断了 recv() / recvfrom() 调用,直到我终止它。 2.7 和 3.9 在 Ubuntu 中运行良好,所以我似乎只在 Windows 上使用 Python 2.7 遇到这个问题。

更新:我认为 IP 地址和端口并不重要,因为代码在使用 Python 3 的 Ubuntu 和 Windows 上运行良好。我无法访问代码,但希望稍后更新。我所知道的是,该板正在向我绑定到下面的特定端口和 IP 地址广播。

recv_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
recv_socket.bind(("192.168.11.149", 5155))
data = recv_socket.recv(1024) 
print(data)

我有意连接到特定 IP,而不是接受所有 IP 地址。该 IP 也是我的 Ubuntu 和 Windows 操作系统(在同一台机器上)的 ifconfig/ipconfig 中显示的正确 IP,因为我通过该特定端口硬连线到我们的主板。

我缺少 Windows 和 Ubuntu 之间的行为变化吗?或者 Python 2.7 和 Python 3.9 之间的更改会导致 recv() 调用像这样冻结?

【问题讨论】:

  • 你绑定的是哪个IP地址?您要向哪个 IP 地址广播?
  • 换句话说,创建一个minimal reproducible example。
  • @user207421 当我绑定到 IP/端口时,消息被广播到相同。我已更新代码以显示 IP 和端口。
  • 向 192.168.11.149 发送 UDP 数据报不是广播。它是单播的。除非您知道自己在做什么,否则您通常应该绑定到 0.0.0.0。除非您的 Windows 和 Linux 共同驻留在同一主机中,否则其 IP 地址必须不同。
  • @user207421 这很公平;我将编辑以更正措辞。对于这种情况,0.0.0.0 将完成同样的事情,虽然我并不十分担心安全风险,但我也看不出它会如何影响任何事情。它在 Linux 上运行相同,并没有解决 Windows 上的问题。 Windows 和 Linux 在同一台机器上运行,并且 if/ipconfig 都显示 192.168.11.149(至少在我连接的以太网端口上)。

标签: python-3.x python-2.7 sockets networking


【解决方案1】:

没有变化,但是给出一个实际的客户端和服务器代码中断的例子对于得到你所看到的行为的答案会有很长的路要走。

以下代码适用于 Python 2 和 Python 3。客户端和服务器不必是相同版本的 Python。

server.py

from __future__ import print_function
import socket

recv_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
recv_socket.bind(('',9999))
while True:
    data,addr = recv_socket.recvfrom(1024) 
    print(addr,'->',repr(data))

client.py

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.sendto(b'hello',('localhost',9999))

【讨论】:

  • 我已更新示例的客户端以列出 IP 和端口。我希望很快能看到代码的服务器端。有没有一种方法可以编写服务器端,在 Ubuntu 的 Python 2.7 中运行良好但在 Windows 中运行良好?
猜你喜欢
  • 2020-12-01
  • 2020-07-22
  • 2011-07-12
  • 2015-01-20
  • 2013-07-20
  • 1970-01-01
  • 2015-06-13
  • 2012-11-15
相关资源
最近更新 更多