Skip to main content
 首页 » 编程设计

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

2025年05月04日17落叶

我有一个用 C 编写的回显服务器和一个用 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() 返回的数据少于要求的数据?

请您参考如下方法:

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

recv 的手册页说:receive 调用通常返回任何可用数据,直到请求的数量,而不是等待收到请求的全部数量。

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