2014-04-22 33 views
0

从我的蟒蛇插座的认识,有一个读端和写结束。我也明白你可以关闭一半的插槽(在某些系统上)。此外,你可以通过发送一些东西并检查异常来检查python是否关闭了套接字。检查套接字后sock.shutdown(SHUT_WR)关闭?

我想知道是否有办法“可靠”检查,如果服务器已关闭套接字的“读”结束之后,客户端已关闭套接字它“写”结束。

例如,如果一台服务器正在运行,这是客户端代码:

sock.shutdown(socket.SHUT_WR) 
#I want to check if I can still read from the socket at this point in code. 

这可能吗?

+1

可能是这个问题http://stackoverflow.com/questions/2441928/testing-for-a-closed-socket会帮助你。 你可以在Python检查以同样的方式:sock.recv(1 socket.MSG_DONTWAIT | socket.MSG_PEEK) – psl

回答

2

从我对python套接字的理解,有一个读取结束和一个写入结束。

号套接字是全双工,双向,读/写,...

我也明白,你可以关闭插座的一半(在某些系统上)。

您可以关闭可以是读取或写入。

此外,如果套接字已通过发送和检查异常关闭,您可以检查python。

您可以检查是否有连接一直由对通过发送一些封闭

我想知道是否有办法“可靠”,如果检查服务器关闭了套接字的“读”端,之后客户端已关闭套接字的“写”端。

如果你是服务器,你不需要检查,因为你是一个接近完成的人。如果你是客户,你不能发送任何东西,所以你不能检查。

例如,如果一台服务器正在运行,这是客户端代码:

sock.shutdown(socket.SHUT_WR) 

我要检查,如果我可以从插座在代码这一点上还是阅读。

告诉你是否仍然可以从套接字读取的唯一方法是尝试从套接字读取。如果对方已经关闭了套接字或半封闭它来发送,您将获得流的末尾,但是这体现在你的语言。这不是你上面提到的问题:你在询问服务器端是否关闭了它的套接字进行读取。

+0

感谢您的帮助。但是,如何在Python中告诉我如果流结束了? – mdenton8

+0

我相信'recv()'会返回一个空字符串,但请自行检查。 – EJP