Найти - Пользователи
Полная версия: socket.error: [Errno 10054] An existing connection was forcibly closed by the remote host
Начало » Python для новичков » socket.error: [Errno 10054] An existing connection was forcibly closed by the remote host
1
Squash
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
while 1:
    conn, addr = s.accept()
    print 'Connected by', addr
    while 1:
        data = conn.recv(8)        <<<<<<<<<<<<<<
        if not data: break
        print data
        sss=c_char_p(data)
        print sss.value

После закрытия клиента процесс завершается на выделенной строке с сообщением socket.error: An existing connection was forcibly closed by the remote host
вместо того, чтобы открывать новое соединение.

Код клиента:
void main ()
{
    WSADATA wsaData;
    WSAStartup (0x101, &wsaData);
    SOCKET ConnSock = socket (AF_INET,SOCK_STREAM,0);
    SOCKADDR_IN si = {0};
    si.sin_family = AF_INET;
    si.sin_addr.s_addr = inet_addr( "127.0.0.1" );;
    si.sin_port = htons(50007);
    connect(ConnSock, (SOCKADDR*) &si, sizeof(si) );
    WSAGetLastError();
    for (unsigned i=0; i<2; i++)
    {
        char str[] = "Quick brown fox jumps over the lazy dog.";
        send( ConnSock, str, sizeof(str), 0 );
    }
}

Если добавить в клиент closesocket, то работает нормально. Но хотелось бы обрабатывать вариант с аварийным закрытием. Как это сделать?
fata1ex
http://docs.python.org/tutorial/errors.html
EBFE
import SocketServer, threading, traceback
class TCPHandler(SocketServer.BaseRequestHandler):
    def handle(self):
        data = self.request.recv(8)
        while data is not None:
            print(data),
            data = self.request.recv(8)
        self.request.close()
class TCPServer(SocketServer.ThreadingTCPServer):
    allow_reuse_address = True
    daemon_threads = True
    def handle_error(self, request, client_address):
        print("some error") 
        print(client_address, str(request))
        print(traceback.format_exc())
httpd = TCPServer(("localhost",1234), TCPHandler)
httpd.serve_forever()
odnochlen
        data = self.request.recv(8)
        while data is not None:
            print(data),
            data = self.request.recv(8)

Можно переписать так (аналог do…while):

        while 1:
            data = self.request.recv(8)
            if data is None:
                break
            print(data)

А вообще sock.makefile()
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB