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

1 投票
1 回答
1125 浏览
提问于 2025-04-17 02:24

我有一个用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()会返回比请求的数据少呢?

1 个回答

8

你给 recv 的长度是一个最大值,而不是目标值。也就是说,recv 不一定会等到接收到 Len 字节的数据才返回,它只要一读到任何数据就会立刻返回。

recv 的手册上写着:接收调用通常会返回任何可用的数据,最多到你请求的数量,而不是等到接收到你请求的全部数据。

如果你需要读取特定数量的字节,你就需要在一个循环中多次调用 recv,把返回的数据拼接起来,直到你读取到足够的数据为止。

撰写回答