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

ngu*_*101 5 python sockets

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

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

Mak*_*zin 5

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

 data = s.recv(size) 
 if not data: 
    # socket has been closed by peer
    s.close()
Run Code Online (Sandbox Code Playgroud)

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

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

xlist:等待"异常情况"(请参阅​​手册页,了解系统认为的这种情况)