一个封闭的客户端套接字附加到 elist 中,但在调用 select 时 ex 中没有异常。我不知道为什么,请你帮帮我。非常感谢!
r,w,ex = select.select(rlist, wlist,elist )
for s in ex:
print "catch a closed socket error!"
要捕获套接字关闭事件,您需要将套接字放入rlist
. 当连接在另一端关闭时,select
返回并表示已关闭的套接字已准备好读取(即它在您的r
列表中)。如果您recv
在此套接字上执行并返回一个空列表(未读取任何内容),则表示连接已关闭。
data = s.recv(size)
if not data:
# socket has been closed by peer
s.close()
据我所见,异常列表(select 的最后一个参数)并没有被广泛使用。它的主要问题是不同的操作系统对这个参数的解释不同。有时它甚至仅用于似乎根本不是例外的情况(OOB 数据)。
socket
模块文档并未具体说明该参数的含义,因此依赖它通常不是一个好主意:
xlist:等待“异常情况”(请参阅手册页了解您的系统认为这种情况的原因)