Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 16, 2012 14:11:37

Squash
Зарегистрирован: 2012-08-14
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

socket.error: [Errno 10054] An existing connection was forcibly closed by the remote host

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, то работает нормально. Но хотелось бы обрабатывать вариант с аварийным закрытием. Как это сделать?

Отредактировано Squash (Авг. 16, 2012 14:12:38)

Офлайн

#2 Авг. 16, 2012 14:15:27

fata1ex
От:
Зарегистрирован: 2009-07-11
Сообщения: 732
Репутация: +  52  -
Профиль   Отправить e-mail  

socket.error: [Errno 10054] An existing connection was forcibly closed by the remote host

Офлайн

#3 Авг. 16, 2012 15:36:37

EBFE
Зарегистрирован: 2012-07-03
Сообщения: 99
Репутация: +  20  -
Профиль   Отправить e-mail  

socket.error: [Errno 10054] An existing connection was forcibly closed by the remote host

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()

Офлайн

#4 Авг. 16, 2012 15:44:12

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

socket.error: [Errno 10054] An existing connection was forcibly closed by the remote host

        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()

Отредактировано odnochlen (Авг. 16, 2012 15:53:35)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version