我可以通过调用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中遇到这个问题。
UPDATE:我认为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()
调用像这样冻结?
没有变化,但给出一个客户端和服务器代码中断的实际示例将大大有助于获得您所看到的行为的答案。
以下是适用于Python 2和Python 3的代码。客户端和服务器不必是相同版本的Python。
服务器.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))
客户.py
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.sendto(b'hello',('localhost',9999))