套接字错误:[Errno 10054] 远程主机强制关闭了现有连接(Python2.7)

3

我有一个关于套接字的问题,它能够正常运行,但是当我关闭客户端或关闭客户端窗口时,服务器会失去连接(服务器需要保持打开状态并等待其他连接)

while True:
    rlist, wlist, xlist = select.select([server_socket]+open_client_sockets, open_client_sockets, [])
    for current_socket in rlist:
        if current_socket is server_socket:
            (new_socket, address) = server_socket.accept()
            open_client_sockets.append(new_socket)
            print 'new member : ' + str(address)
        else:
            data = current_socket.recv(1024)
            print data
            if data == "":
                open_client_sockets.remove(current_socket)
                print 'Connection with client closed.'

            else:
                send_messages(data)

问题出在这部分 -
if data == "":
                open_client_sockets.remove(current_socket)
                print 'Connection with client closed.

以下是错误信息 -

data = current_socket.recv(1024)
error: [Errno 10054] An existing connection was forcibly closed by the remote host

我之前的套接字中没有遇到这个错误。

1个回答

3
当客户端通过 client_socket.shutdown(socket.SHUT_WR) 等优雅地关闭套接字时,服务器将接收所有数据,然后它的下一个 recv 调用将获得 0 字节。您已经为此情况编写了代码。
当客户端没有进行优雅关闭而退出时,底层套接字实现将进行不太优雅的终止,其中包括向服务器发送一个 RESET。在这种情况下,服务器会收到您见过的异常。这意味着在套接字级别上不能保证服务器接收到了所有数据。
您应该更新客户端以便优雅地关闭,并决定您的非优雅退出政策应该是什么。

我怎样知道服务器是否遭受了不正常的终止?@tdelaney - Daniel david
你遇到了异常。在发送和接收时,使用try/except块包装它们以捕获socket.error应该就足够了。实际的错误在Linux和Windows之间有所不同(10054表示你在Windows上),但检查10054和54并重新引发其他错误应该就可以解决问题了。 - tdelaney

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接