【发布时间】:2020-10-06 09:40:20
【问题描述】:
在 python 套接字模块 recv 方法 socket.recv(bufsize[, flags]) docs here 中,它声明:
Receive data from the socket. The return value is a bytes object representing the data received.
The maximum amount of data to be received at once is specified by bufsize.
我知道bufsize代表一次接收到的最大数据量,如果接收到的数据量小于bufsize,说明另一端socket发送的字节数少比bufsize
第一次调用socket.recv(bufsize)返回的数据是否有可能是bufsize,但网络缓冲区中仍有数据?
例如。
data = socket.recv(10)
print(len(data)) # outputs 5
data = socket.recv(10) # calling `socket.recv(10)` returns more data without the
# socket on the other side doing `socket.send(data)`
示例中的场景是否会发生?这是否适用于 unix 域套接字以及常规 TCP/IP 套接字?
【问题讨论】:
-
不知道 unix 套接字,但对于 TCP 套接字,答案是肯定的——您必须假设您收到的内容可能多于或少于任何一次 send() 调用的内容。这就是为什么您经常需要在 TCP 之上添加协议来获取分隔消息的原因。或者使用像 Websocket 这样的协议,它在 tcp 之上运行并确保消息完整性。
标签: python sockets networking