5

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

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

1 回答 1

6

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

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

据我所见,异常列表(select 的最后一个参数)并没有被广泛使用。它的主要问题是不同的操作系统对这个参数的解释不同。有时它甚至仅用于似乎根本不是例外的情况(OOB 数据)。

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

xlist:等待“异常情况”(请参阅​​手册页了解您的系统认为这种情况的原因)

于 2012-08-14T09:51:44.867 回答