在Python中套接字接收/发送数据时,实际发生了什么
我读过这本书 您可以将客户端套接字转换为类似beast的文件,并使用读写。。。除了警告您需要在套接字上使用刷新之外。这些是缓冲的“文件”,一个常见的错误是写一些东西,然后读一个回复。如果没有刷新,您可能会一直等待回复,因为请求可能仍在输出缓冲区中 现在我们来谈谈套接字的主要障碍——发送和接收操作在网络缓冲区上 Python中的在Python中套接字接收/发送数据时,实际发生了什么,python,sockets,Python,Sockets,我读过这本书 您可以将客户端套接字转换为类似beast的文件,并使用读写。。。除了警告您需要在套接字上使用刷新之外。这些是缓冲的“文件”,一个常见的错误是写一些东西,然后读一个回复。如果没有刷新,您可能会一直等待回复,因为请求可能仍在输出缓冲区中 现在我们来谈谈套接字的主要障碍——发送和接收操作在网络缓冲区上 Python中的socket对象是一个文件描述符,您可以使用makefile()获取与套接字关联的file对象 根据警告, 您需要在插座上使用齐平。这些是缓冲的“文件”…如果没有刷新,您可
socket对象
是一个文件描述符,您可以使用makefile()
获取与套接字关联的file对象
根据警告,
您需要在插座上使用齐平。这些是缓冲的“文件”…如果没有刷新,您可以永远等待答复,因为请求可能仍在您的输出缓冲区中…发送和接收操作在网络缓冲区上
我认为当套接字发送/接收时,实际上有两个缓冲区:“文件缓冲区”和“网络缓冲区”。如果将套接字
转换为类文件对象
并使用写入(数据)
,则首先将数据写入“文件输出缓冲区”,然后使用刷新
将数据写入“网络发送缓冲区”。所有这些都可以解释文档中的警告:在write
之后使用flush
,否则read
可能会永远阻塞
我画了一张图来展示我对socket
底层“两个缓冲区”的看法
所以我的问题是如何理解上面的引语?我的“两个缓冲区”模型理解正确吗?希望您的回复,谢谢 是的,你的模型基本上是正确的。理解该引用中提到的“网络缓冲区”驻留在操作系统中(即不在进程地址空间的范围内),而“文件缓冲区”实际上是由python运行时在进程内实现的,这可能会有所帮助。这就是为什么需要flush
:图中文件缓冲区和网络缓冲区之间的边界本质上是操作系统的“系统调用接口”
换句话说,当您调用socket.send时,缓冲区中的数据字节将直接传输到操作系统网络缓冲区(取决于空间可用性)。然后,它们将根据标准网络机制(TCP等)发送到网络对等方。然而,当您使用makefile
时,您实际上是在围绕这个问题构建一个缓冲机制。当您写入“类似文件的对象”时,字节只需传输到与文件关联的隐藏缓冲区(但仍在进程的地址空间内)。调用flush
然后执行相当于socket.send的操作;将这些字节移动到操作系统的缓冲区中进行传输
有两种情况下,通常使用makefile
:(当然,您可以使用str
或bytes
对象自己实现这种缓冲,但通常更方便的方法是简单地写入类似文件的对象)