【发布时间】:2016-04-22 18:22:57
【问题描述】:
我从Socket Programming HOWTO in Python Documentation读到了这篇文章
您可以将客户端套接字转换为类似文件的野兽并使用读写。 ...除了警告您需要在套接字上使用flush。这些是缓冲的“文件”,一个常见的错误是写一些东西,然后读取以获取回复。如果没有刷新,您可能会永远等待回复,因为请求可能仍在您的输出缓冲区中。
现在我们来看看套接字的主要绊脚石 - send 和 recv 在网络缓冲区上操作
socket object在Python中是一个文件描述符,你可以使用makefile()来获取一个与socket关联的file object。
根据警告,
您需要在套接字上使用flush。这些是缓冲的“文件”...如果没有刷新,您可能会永远等待回复,因为请求可能仍在您的输出缓冲区中... send 和 recv 在网络缓冲区
上运行
我认为socket send/recv时,实际上有两个缓冲区:“文件缓冲区”和“网络缓冲区”。如果将socket 转换为file like object 并使用write(data),首先将数据写入“文件输出缓冲区”,然后使用flush 将数据写入“网络发送缓冲区”。所有这些都可以解释文档中的警告:在write 之后使用flush 或read 可能会永远阻塞。
我画了一张图片来表达我对socket 的底层“两个缓冲区”的看法。
所以我的问题是如何理解上面的引用?我的“两个缓冲区”模型理解正确吗?希望得到您的回复,谢谢!
【问题讨论】: