Python 2.7,Windows XP。我有一个服务器向客户端发送消息。我使用select模块来检查准备好接收的套接字,以及捕获异常条件。我的印象是,如果客户端关闭套接字,select()将在异常条件的套接字列表中返回所述套接字,但它似乎没有这样做:
lin, lout, lex = select.select(socklist, socklist, socklist)
for sock in lin:
# handle incoming messages
for sock in lout:
# send updates
for sock in lex:
# shut down server-side objects for particular client
服务器确定客户端是否仍然连接的最佳方法是什么?服务器并不总是发送数据,所以我不想依赖socket.send()来测试客户端是否仍在那里。
答案 0 :(得分:6)
关闭的套接字不是异常(错误)条件。会发生什么是套接字将在读取列表(lin)中,当您读取时将获得0个字节。这意味着另一端关闭了套接字。
<强>更新强>:
在正常练习中,您永远不会在除外列表中看到任何内容,并且可以安全地忽略它。这是很少使用的东西,如带外(OOB)等。
回答问题更新:
可靠且快速地检测到插座的另一端已经消失可能会非常棘手。如果能够可靠地,及时地及时地检测它,那么你应该使用更高级别的机制,例如keepalive / heartbeat。
如果客户端干净地关闭了套接字,那么您应该在读取列表中看到套接字。从套接字读取将返回0字节,表示套接字已关闭(EOF)。
答案 1 :(得分:2)
套接字上“异常条件”的确切定义取决于底层实现。对于Windows XP,底层实现是WinSock select function,例外情况包括:
答案 2 :(得分:1)
关闭套接字的客户端并不例外。事实上,它不是特别的。您将在异常条件列表中获得各种错误,但正确关闭的套接字不是其中之一。