socket.error:[Errno 10054]远程主机强制关闭现有连接(python2.7)

时间:2016-02-21 21:36:05

标签: python python-2.7 sockets

我的套接字有问题,它运行良好但是当我关闭客户端/关闭客户端窗口时,服务器丢失了连接(服务器需要保持打开并等待其他连接)

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 个答案:

答案 0 :(得分:1)

当客户端正常关闭套接字(例如client_socket.shutdown(socket.SHUT_WR))时,服务器将接收所有数据,然后其下一个recv调用将获得0个字节。你为这个案子编了代码。

当客户端退出而没有正常关闭时,底层套接字实现将执行非正常终止,包括向服务器发送RESET。在这种情况下,服务器会获得您已经看到的异常。这意味着在套接字级别,无法保证服务器接收到所有数据。

您应该更新您的客户,使其在关闭时更加优雅,并决定您的政策应该在非正常退出时采取什么措施。