为什么不能select.select()捕获关闭套接字错误?

时间:2012-08-14 09:41:37

标签: python sockets

一个封闭的客户端套接字附加到elist中,但是当select选择时,ex中没有异常。我不知道为什么,你能帮帮我吗?非常感谢!

r,w,ex = select.select(rlist, wlist,elist )
    for s in ex:
       print "catch a closed socket error!"

1 个答案:

答案 0 :(得分:5)

要捕获正在关闭的套接字事件,您需要在rlist中使用套接字。当连接在另一侧关闭时,select返回并表示已关闭的套接字已准备好读取(即它位于您r列表中)。如果在此套接字上执行recv并返回一个空列表(没有读取任何内容),则表示连接已关闭。

 data = s.recv(size) 
 if not data: 
    # socket has been closed by peer
    s.close()

从我所看到的,异常列表(select的最后一个参数)没有被广泛使用。它的主要问题是不同的操作系统以不同的方式解释此参数。有时它甚至只用于根本看起来不是例外的情况(OOB数据)。

socket模块文档并不具体说明该参数的含义,因此依赖它通常不是一个好主意:

   xlist:等待“异常情况”(参见手册页)   您的系统认为这样的条件)