Frage

I not understand how connection close for client socket.

import asyncore
import socket

class TCPClientHandle(asyncore.dispatcher):
    def __init__(self, sock, server):
        asyncore.dispatcher.__init__(self, sock)
        self.server = server

    .....

    def handle_close(self):
        print 'Client: handle_close'
        self.server.removeClient(self)

class TCPServer(asyncore.dispatcher, dict):
    def __init__(self, host='127.0.0.1', port=31337):
        asyncore.dispatcher.__init__(self)
        self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
        dict.__init__(self, {self.fileno(): self})
        self.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        self.bind((host, port))
        self.listen(5)

    def handle_accept(self):
        print 'Server: handle_accept'
        client, (host, port,) = self.accept()

        print 'Новый клиент %s:%d' % (host, port,)
        self[client.fileno()] = TCPClientHandle(client, self)

    def removeClient(self, client):
        print 'Server: removeClient'
        del self[client.fileno()]

def main():
    asyncore.loop(0.1, True, TCPServer('127.0.0.1'))

if __name__ == '__main__':
    main()

If I rewrite removeClient method in TCPServer

def removeClient(self, client):
    print 'Server: removeClient'
    del self[client.fileno()]
    client.close()

I have error socket.error: [Errno 9] Bad file descriptor

P.S sorry for my english


UPD: Dirty hack

class TCPServer(asyncore.dispatcher, dict):
    doDel = []
    ....
    def handle_accept(self):
        print 'Server: handle_accept'
        client, (host, port,) = self.accept()
        print 'Новый клиент %s:%d' % (host, port,)
        self[client.fileno()] = TCPClientHandle(client, self)
        if len(self.doDel) >= 5:
            self.doDel.pop().close()

    ....

    def removeClient(self, client):
        print 'Server: removeClient'
        del self[client.fileno()]
        self.doDel.insert(0, client)

:) It's work!

War es hilfreich?

Lösung

That right. Thanks everybody

class TCPClientHandle(asyncore.dispatcher_with_send):
    def __init__(self, sock, server):
        asyncore.dispatcher.__init__(self, sock)
        self.server = server

    .....

    def handle_close(self):
        if self.server.removeClient(self):
            self.close()

class TCPServer(asyncore.dispatcher, dict):
    .....
    def removeClient(self, client):
        del self[client.fileno()]
        return True
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top