首页 > 解决方案 > Python 套接字接收函数

问题描述

在此处的 python 套接字模块 recv 方法socket.recv(bufsize[, flags])文档中,它指出:

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,这意味着另一端的套接字发送的字节数小于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 套接字?

标签: pythonsocketsnetworking

解决方案


网络通信中的真正问题是接收方无法控制网络何时以及如何传递数据。

如果返回的数据大小recv小于请求的大小,这意味着recv调用的时刻,本地网络缓冲区中没有更多数据可用。因此,如果您可以确保:

  • 发件人已停止发送数据
  • 网络可以传递所有数据

然后一个新的revc呼叫将被阻止。

问题在于,在现实世界的情况下,您永远无法确定上述两个假设。TCP 是一种流协议,它只保证所有发送的字节都会以正确的顺序到达接收方。但是如果不提供时间保证,并且发送的数据包可以被网络分段或重新组装(从发送方的网络 TCP 堆栈开始,到接收方的 TCP 堆栈结束)


推荐阅读