socket, viele verbindungen und TIME_WAIT
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
participants (1)
-
Bastian Venthur