我正在编写两个 python 脚本,使用 python sockets 通过 UDP 进行通信。这是代码的相关部分
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind((HOST, PORT))
s.setblocking(True) #I want it to be blocking
#(...)
(msg, addr) = sock.recvfrom(4)
#(...)
(msg2, addr2) = sock.recvfrom(2)
我希望接收是阻塞的,并且在读取第一个 4 字节部分之前我不知道整个消息的大小。上面的代码在 sock.recvrfom(2)
部分被阻塞,而修改后,使用一个 sock.recvfrom
而不是两个可以正常工作:
(msg, addr) = sock.recvfrom(6) #works ok, but isn't enough for my needs
知道如何方便地分两部分读取传入数据,或者为什么代码无法按预期工作吗?
最佳答案
socket.recvfrom(size)
将(对于 UDP 套接字)读取一个数据包,最多 size
字节。多余的数据被丢弃。如果你想接收整个数据包,你必须传递一个更大的 bufsize,然后按位处理数据包(而不是尝试按位接收它。)
如果您想要一个更方便、更灵活的网络 I/O 接口(interface),请考虑 Twisted .
关于python:调用 socket.recvfrom() 两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6243691/