Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中套接字接收/发送数据时,实际发生了什么_Python_Sockets - Fatal编程技术网

在Python中套接字接收/发送数据时,实际发生了什么

在Python中套接字接收/发送数据时,实际发生了什么,python,sockets,Python,Sockets,我读过这本书 您可以将客户端套接字转换为类似beast的文件,并使用读写。。。除了警告您需要在套接字上使用刷新之外。这些是缓冲的“文件”,一个常见的错误是写一些东西,然后读一个回复。如果没有刷新,您可能会一直等待回复,因为请求可能仍在输出缓冲区中 现在我们来谈谈套接字的主要障碍——发送和接收操作在网络缓冲区上 Python中的socket对象是一个文件描述符,您可以使用makefile()获取与套接字关联的file对象 根据警告, 您需要在插座上使用齐平。这些是缓冲的“文件”…如果没有刷新,您可

我读过这本书

您可以将客户端套接字转换为类似beast的文件,并使用读写。。。除了警告您需要在套接字上使用刷新之外。这些是缓冲的“文件”,一个常见的错误是写一些东西,然后读一个回复。如果没有刷新,您可能会一直等待回复,因为请求可能仍在输出缓冲区中

现在我们来谈谈套接字的主要障碍——发送和接收操作在网络缓冲区上

Python中的
socket对象
是一个文件描述符,您可以使用
makefile()
获取与套接字关联的
file对象

根据警告,

您需要在插座上使用齐平。这些是缓冲的“文件”…如果没有刷新,您可以永远等待答复,因为请求可能仍在您的输出缓冲区中…发送和接收操作在网络缓冲区上

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

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


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

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

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

有两种情况下,通常使用
makefile
:(当然,您可以使用
str
bytes
对象自己实现这种缓冲,但通常更方便的方法是简单地写入类似文件的对象)