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

时间:2014-06-07 16:55:15

标签: python sockets

我正在制作一个位于浏览器和网络之间的代理。有一段我似乎无法开始工作的代码。

#send request to web server
web_client.send(request)
#signal client is done with sending
web_client.shutdown(1)

如果我使用shutdown(1),代理在性能和速度方面有很好的改进。 但是,如果我使用shutdown,某些Web服务器不会发送响应。控制台输出:

request sent to host wix.com
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.

但是,如果我删除shutdown(1),则没有排序问题。控制台输出:

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

,浏览器通常显示网站。 为什么会这样?这只发生在某些主机上。

2 个答案:

答案 0 :(得分:0)

来自https://docs.python.org/2/library/socket.html#socket.socket.shutdown

  

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

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

答案 1 :(得分:0)

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