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 使用socket.shutdown(1)会阻止web服务器发送响应_Python_Sockets - Fatal编程技术网

Python 使用socket.shutdown(1)会阻止web服务器发送响应

Python 使用socket.shutdown(1)会阻止web服务器发送响应,python,sockets,Python,Sockets,我正在制作一个位于浏览器和web之间的代理。有一段代码我似乎无法使用 #send request to web server web_client.send(request) #signal client is done with sending web_client.shutdown(1) 如果我使用shutdown1,代理在性能和速度上都有很大的提高。 但是,如果使用shutdown,某些web服务器不会发送响应。控制台输出: request sent to host wix.com go

我正在制作一个位于浏览器和web之间的代理。有一段代码我似乎无法使用

#send request to web server
web_client.send(request)
#signal client is done with sending
web_client.shutdown(1)
如果我使用shutdown1,代理在性能和速度上都有很大的提高。 但是,如果使用shutdown,某些web服务器不会发送响应。控制台输出:

request sent to host wix.com
got response packet of len 0
got response packet of len 0
breaking loop
got response packet of len 1388
got response packet of len 1388
got response packet of len 1388
got response packet of len 989
got response packet of len 0
got response packet of len 0
breaking loop
然后浏览器显示

The connection was reset
The connection to the server was reset while the page was loading.
但是,如果我删除shutdown1,就不会有类似的问题。控制台输出:

request sent to host wix.com
got response packet of len 0
got response packet of len 0
breaking loop
got response packet of len 1388
got response packet of len 1388
got response packet of len 1388
got response packet of len 989
got response packet of len 0
got response packet of len 0
breaking loop
浏览器通常会显示网站。 为什么会这样?这仅在某些主机上发生

来自

根据平台的不同,关闭一半连接 也可以关闭另一半,例如在Mac OS X上,关机 不允许在连接的另一端进一步读取


这可能不是问题,因为您说只有一些web服务器受到影响,但您的代理是否在Mac OS X上运行?

只有在套接字上没有待发送的数据时,TCP/IP堆栈才会正常关闭连接。发送完成表示只有数据被推入内核缓冲区&准备发送。在这里,当TCP堆栈中有一些发送数据挂起时,在发送之后立即调用shutdown。因此,TCP堆栈将reset发送到另一端,因为它决定应用程序不希望完成发送进程。要关闭连接,请在套接字上调用select&等待套接字可写,这意味着所有数据都被推出堆栈。然后调用shutdown并关闭套接字。

检查是否为失败的主机设置了keep-alive参数。我已经检查过了,这是不相关的。顺便说一下,我找到了一个解决方法,设置了一个默认为true的use\u-shut布尔参数。如果程序收到此错误,它将再次发送请求,并将use_shut设置为false,不使用shutdown1。它似乎可以工作,但相当糟糕。不,它在Linux上。我想这是由于web服务器,因为大多数web主机都没有这个问题。