gpt4 book ai didi

python - 在 Python 中套接字接收/发送数据时到底发生了什么

转载 作者:行者123 更新时间:2023-11-28 19:13:27 25 4
gpt4 key购买 nike

我从 Socket Programming HOWTO in Python Documentation 读到这篇文章

you can transform your client socket into a file-like beast and use read and write. ... except to warn you that you need to use flush on sockets. These are buffered “files”, and a common mistake is to write something, and then read for a reply. Without a flush in there, you may wait forever for the reply, because the request may still be in your output buffer.

Now we come to the major stumbling block of sockets - send and recv operate on the network buffers

socket object在Python中是一个文件描述符,可以使用makefile()得到一个与socket关联的file object

根据警告,

you need to use flush on sockets. These are buffered “files”...Without a flush in there, you may wait forever for the reply, because the request may still be in your output buffer...send and recv operate on the network buffers

我想当socket send/recv时,实际上有两个缓冲区:“文件缓冲区”和“网络缓冲区”。如果将socket转换为file like object并使用write(data),首先,数据写入“文件输出缓冲区”,然后写入使用 flush 的“网络发送缓冲区”。所有这些都可以解释文档中的警告:在 write 之后使用 flush 否则 read 可能会永远阻塞。

我画了一张图来表达我对socket底层“两个缓冲区”的看法。

socket transfer data model

所以我的问题是如何理解上面的引用?我的“双缓冲区”模型理解正确吗?希望得到您的回复,谢谢!

最佳答案

是的,您的模型基本上是正确的。理解该引用中提到的“网络缓冲区”驻留在操作系统中(即不在您的进程地址空间范围内)可能会有所帮助,而“文件缓冲区”实际上是由您的进程在您的进程中实现的 python 运行时。这就是需要 flush 的原因:图表中文件缓冲区和网络缓冲区之间的边界本质上是操作系统的“系统调用接口(interface)”。

换句话说,当您调用 socket.send 时,缓冲区中的数据字节将直接传输到操作系统网络缓冲区(受可用空间限制)。然后根据标准网络机制(TCP 等)将它们发送到网络对等点。但是,当您使用 makefile 时,您实际上是在围绕它构建一个缓冲机制。当您写入“类文件对象”时,字节会简单地传输到与文件相关联的隐藏缓冲区(但仍在您的进程的地址空间内)。然后调用 flush 相当于 socket.send;将这些字节移动到操作系统的缓冲区中进行传输。

在两种情况下,通常会使用 makefile:(1) 您有一些其他现有代码需要一个类似文件的对象,您希望使用该对象来构造字节通过网络发送/接收,或者 (2) 您想要缓冲行为,比如说,出于性能原因(当然,您总是可以使用 strbytes 对象,但简单地写入类似文件的对象通常更方便。

关于python - 在 Python 中套接字接收/发送数据时到底发生了什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36800869/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com