【发布时间】:2016-12-29 14:58:03
【问题描述】:
假设我使用 1024 作为客户端套接字的缓冲区大小:
recv(1024)
假设服务器要发送给我的消息由 2024 个字节组成。 我的套接字只能接收 1024 个字节。其他 1000 字节发生了什么?
- recv 方法是否会等待一定的时间(比如 2 秒)以获取更多数据并在此时间跨度之后停止工作? (即如果剩下的数据在 3 秒后到达,socket 就不再接收数据了?)
或
- recv 方法在收到 1024 字节数据后会立即停止工作吗? (即其他 1000 个字节会被丢弃吗?)
如果 1.) 是正确的...有没有办法让我确定时间量,recv 数据应该在返回之前等待还是由系统确定? (即我可以告诉套接字在停止等待更多数据之前等待 5 秒吗?)
更新: 假设,我有以下代码:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((sys.argv[1], port))
s.send('Hello, world')
data = s.recv(1024)
print("received: {}".format(data))
s.close()
假设服务器发送的数据大小 > 1024 字节。我可以确定变量“数据”将包含所有数据(包括第 1024 个字节之外的数据)吗? 如果我不能确定这一点,我将如何更改代码,以便我始终可以确定变量“数据”将包含从服务器发送的所有数据(在一个或多个步骤中)?
【问题讨论】:
-
您告诉计算机接收 1024 字节的数据,它确实如此。它并不关心一开始是否有有更多数据要读取。
-
@ForceBru - recv 可以返回 1 到 1024 字节之间的任何内容(或 0,表示 recv 管道已被另一方关闭)。如果您要求 1024,但例如 44 立即可用,您将只得到 44。
-
@ForceBru - 你说它准确地接收了 1024 个字节,但它没有。我试图澄清这一点。
-
@ForceBru 你说“你告诉计算机接收 1024 字节的数据,它确实如此”。
-
@ForceBru - 引用:“你告诉计算机接收 1024 字节的数据,它确实如此。” 这不是真的。它可能接收不到 1024 个字节。更少不是“完全”。