python - 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 套接字?
解决方案
网络通信中的真正问题是接收方无法控制网络何时以及如何传递数据。
如果返回的数据大小recv
小于请求的大小,这意味着在recv
调用的时刻,本地网络缓冲区中没有更多数据可用。因此,如果您可以确保:
- 发件人已停止发送数据
- 网络可以传递所有数据
然后一个新的revc
呼叫将被阻止。
问题在于,在现实世界的情况下,您永远无法确定上述两个假设。TCP 是一种流协议,它只保证所有发送的字节都会以正确的顺序到达接收方。但是如果不提供时间保证,并且发送的数据包可以被网络分段或重新组装(从发送方的网络 TCP 堆栈开始,到接收方的 TCP 堆栈结束)
推荐阅读
- database - 如何找到集群中最大的文件
- c - 使用 CFUserNotification API 创建和更新进度条
- javascript - 使用 addEventListener 时无法使用键盘
- python - 如何使 get_random_string Django 模块只返回数值?
- reactjs - 在 Next.js 中使用 getServerSideProps 和 useEffect 获取数据会导致重复请求
- python - python数组的迭代操作(指数移动平均)
- excel - 使用访问VBA查找excel中的最后一行/列
- octave - 求解符号方程中自变量的系数(函数)
- apache - 将 apache 服务器的一个子文件夹作为代理重定向到 azure Web 应用程序
- spring-boot - 如何简单地激活redis