[Python-de] socket, viele verbindungen und TIME_WAIT

Bastian Venthur venthur at debian.org
Mo Jul 20 09:53:08 UTC 2009


Hi,

ich habe eine simple Testanwendung:

Ein TCP-Server:
===============

Macht einen TCP-Socket auf und fragt dann in einer Endlosschleife mit
select nach daten, holt diese Vollständig ab und schließt die Connection:

    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    #sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    sock.setblocking(False)
    sock.bind(ADDR)
    sock.listen(1)

    # use select to poll the sockets
    while True:
        l = select.select([sock], [], [])
        for i in l[0]:
            if i == sock:
                conn, addr = i.accept()
                data = ""
                while 1:
                    #print "Reading from connection:"
                    tmp = conn.recv(1024)
                    if not tmp:
                        #print "End of transmission."
                        # Got empty data -> end of transmission
                        break
                    data += tmp
                conn.shutdown(socket.SHUT_RDWR)
                conn.close()
                #print data
            else:
                pass



Ein Client/Producer:
====================

In einer Endlosschleife macht der Producer eine Verbindung zum Server
auf, sendet etwas und macht die Verbindung mit socket.close() wieder zu.

Das Problem: nach ~25.000 erfolgreichen Verbindungen kommt die
Fehlermeldung:

error: (99, 'Cannot assign requested address')

wenn ich sock.connect() am Client aufrufe. Ein Blick in netstat zeigt
mir, das ebensoviele Verbindungen auf TIME_WAIT sind:

...
tcp        0      0 localhost:56946   localhost:12347         TIME_WAIT
tcp        0      0 localhost:47163   localhost:12347         TIME_WAIT
tcp        0      0 localhost:42758   localhost:12347         TIME_WAIT
...

Ich habe gelesen, das SO_REUSEADDR genau dieses Problem beheben soll,
aber weder wenn ich es am Client-Socket, am Server-Socket oder beiden
einsetze ändert sich etwas. Ich habe ferner gelesen, dass diese Option
nur am Serversocket sinnvoll ist, aber die Verbindungen auf TIME_WAIT
kommen ja offensichtlich vom Clienten. Weis jemand Rat?


Schöne Grüße,

Bastian


-- 
Bastian Venthur                                      http://venthur.de
Debian Developer                                 venthur at debian org




Mehr Informationen über die Mailingliste python-de