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

时间:2011-09-15 22:10:53

标签: 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')

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

1234567890123456 //recvdata
20
12345678901234567890 //sent data

我不确定为什么会发生这种情况,如何阻止recv()返回的数据少于要求的数据?

1 个答案:

答案 0 :(得分:6)

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

recv的手册页说:接收电话通常会返回所有可用的数据,最多可达到请求的金额,而不是等待收到所需的全部金额。

如果需要读取给定的字节数,则需要在循环中调用recv并连接返回的数据包,直到读完为止。