Python阻塞recv返回的数据少于要求的数据

Wei*_*Shi 1 python recv

我在C中有一个echo服务器,在Python中有一个测试客户端.服务器具有有限的读缓冲区,例如16字节.当客户端发送超过16个字节时,它将首先读取16,写回客户端然后再次读取.

我测试了服务器telnet,我得到了与输入相同的字符串,即使它长于16个字节.但是这个Python客户端不起作用.

//data is initialized to be 20 bytes data
Len = 20
sock.setblocking(1)
sock.send(data)
recvdata = sock.recv(Len)
if(recvdata != data):
    print recvdata.encode('hex')
    print Len
    print data.encode('hex')
Run Code Online (Sandbox Code Playgroud)

此客户端仅接收服务器写回的前16个字节.服务器日志确实显示两次写入(16 + 4).Python输出看起来像这样

1234567890123456 //recvdata
20
12345678901234567890 //sent data
Run Code Online (Sandbox Code Playgroud)

我不确定为什么会这样,为什么阻塞recv()返回的数据少于它所要求的数据?

Ric*_*dle 7

你给的长度recv是最大值,而不是目标.无法保证recv等待Len接收字节 - 它可以在读取任何数据后立即返回.

对于该名男子页recv说:在接听电话正常返回的任何数据可用,直到请求的数量,而不是等待接收请求的全额.

如果你需要读取的字节给定数量,你需要调用recv在一个循环,直到您已经阅读足够的串联返回的数据包.