1

我有一个 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()返回的数据少于要求的数据?

4

1 回答 1

8

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

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

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

于 2011-09-15T22:15:01.873 回答