无法通过python中的socket.getpeername()检索损坏的TCP / IP连接的地址

时间:2016-10-14 23:44:16

标签: python python-3.x tcp

我通过select.select监视器运行TCP服务器,并通过连接IP地址保留动态地址簿。每当连接中断时,服务器将通过函数" socket.getpeername()"检索另一侧的IP地址。并从动态地址簿中删除了相应的条目。

一般来说这很好用。 "的 socket.getpeername()"将始终在断开连接中告诉另一方的地址。但是有时会失败 - 并且Windows说套接字已被破坏,以便" socket.getpeername()"不能工作!

error image

我发送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

0 个答案:

没有答案