我通过select.select监视器运行TCP服务器,并通过连接IP地址保留动态地址簿。每当连接中断时,服务器将通过函数" socket.getpeername()"检索另一侧的IP地址。并从动态地址簿中删除了相应的条目。
一般来说这很好用。 "的 socket.getpeername()"将始终在断开连接中告诉另一方的地址。但是有时会失败 - 并且Windows说套接字已被破坏,以便" socket.getpeername()"不能工作!
我发送catched broken socket到子线程处理它,子线程发现socket本身坏了,不能使用getpeername()否则WinError10038
主线程在选择读取中捕获损坏的套接字:
read_sockets, write_sockets, error_sockets = select.select(active_socks,[],[],TIMEOUT)
for sock in read_sockets:
......
except:
mailbox.put( (("sock_err",sock), 'localhost') )
最后一步是将破损的套接字对象" sock"进入队列"邮箱"。 然后子线程从"邮箱"接收此消息。并尝试对套接字对象“sock”执行某些操作并且getpeername()出错有时:
print(sock)>>>
<socket.socket [closed] fd=-1, family=AFNET, type=SOCKSTREAM, proto=0>
sock.getpeername()>>>
OS.Error[WinError10038]an operation was attempted on something that is not a socket