python:两次调用socket.recvfrom()

nie*_*aki 2 python sockets udp

我正在编写两个python脚本,使用python 套接字通过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)
Run Code Online (Sandbox Code Playgroud)

我希望接收是阻塞的,在读取第一个4字节部分之前我不知道整个消息的大小.以上代码在sock.recvrfom(2)部件上被阻止 ,而修改后,一个sock.recvfrom而不是两个工作正常:

(msg, addr) = sock.recvfrom(6) #works ok, but isn't enough for my needs
Run Code Online (Sandbox Code Playgroud)

知道我如何方便地分两部分读取传入的数据或为什么代码不能按预期工作?

Tho*_*ers 5

socket.recvfrom(size)将(对于UDP套接字)读取一个数据包,最多为size字节.多余的数据被丢弃.如果要接收整个数据包,则必须传递更大的bufsize,然后以位为单位处理数据包(而不是尝试以位为单位接收它.)

如果您想要一个更方便,更易变的网络I/O接口,请考虑使用Twisted.