socket programming network español book all python sockets network-programming system

programming - socket python 3



¿Por qué veo el error de "restablecimiento de conexión por pares"? (1)

La E / S de socket Python a veces sufre un restablecimiento de conexión por parte de un par. Tiene que ver con Global Interpreter Lock y cómo se programan los hilos. Publiqué algunas referencias sobre el tema.

El time.sleep(0.0001) parece ser la solución recomendada porque ajusta la programación del hilo y permite que el socket E / S termine.

Estoy probando Cogen en una caja de Mac OS X 10.5 usando Python 2.6.1. Tengo un servidor de eco simple y un cliente-bomba que crea 10,000 conexiones de cliente como una prueba. 1000, 5000, etc. todo funciona espléndidamente. Sin embargo, en alrededor de 10 000 conexiones, el servidor comienza a eliminar clientes aleatorios: los clientes ven "restablecimiento de conexión por pares".

¿Hay algún conocimiento básico de redes que me falta aquí?

Tenga en cuenta que mi sistema está configurado para manejar archivos abiertos (launchctl limit, sysctl (maxfiles, etc.) y ulimit -n son todos válidos; estado allí, hecho eso). Además, he verificado que cogen está eligiendo usar kqueue bajo las sábanas.

Si agrego un ligero retraso a las llamadas de client-connect (), todo funciona bien. Por lo tanto, mi pregunta es, ¿por qué un servidor bajo estrés dejaría caer a otros clientes cuando hay una alta frecuencia de conexiones en un corto período de tiempo? ¿Alguien más se topa con esto?

Para completar, aquí está mi código.

Aquí está el servidor:

# echoserver.py from cogen.core import sockets, schedulers, proactors from cogen.core.coroutines import coroutine import sys, socket port = 1200 @coroutine def server(): srv = sockets.Socket() srv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) addr = (''0.0.0.0'', port) srv.bind(addr) srv.listen(64) print "Listening on", addr while 1: conn, addr = yield srv.accept() m.add(handler, args=(conn, addr)) client_count = 0 @coroutine def handler(sock, addr): global client_count client_count += 1 print "SERVER: [connect] clients=%d" % client_count fh = sock.makefile() yield fh.write("WELCOME TO (modified) ECHO SERVER !/r/n") yield fh.flush() try: while 1: line = yield fh.readline(1024) #print `line` if line.strip() == ''exit'': yield fh.write("GOOD BYE") yield fh.close() raise sockets.ConnectionClosed(''goodbye'') yield fh.write(line) yield fh.flush() except sockets.ConnectionClosed: pass fh.close() sock.close() client_count -= 1 print "SERVER: [disconnect] clients=%d" % client_count m = schedulers.Scheduler() m.add(server) m.run()

Y aquí está el cliente:

# echoc.py import sys, os, traceback, socket, time from cogen.common import * from cogen.core import sockets port, conn_count = 1200, 10000 clients = 0 @coroutine def client(num): sock = sockets.Socket() sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) reader = None try: try: # remove this sleep and we start to see # ''connection reset by peer'' errors time.sleep(0.001) yield sock.connect(("127.0.0.1", port)) except Exception: print ''Error in client # '', num traceback.print_exc() return global clients clients += 1 print "CLIENT #=%d [connect] clients=%d" % (num,clients) reader = sock.makefile(''r'') while 1: line = yield reader.readline(1024) except sockets.ConnectionClosed: pass except: print "CLIENT #=%d got some other error" % num finally: if reader: reader.close() sock.close() clients -= 1 print "CLIENT #=%d [disconnect] clients=%d" % (num,clients) m = Scheduler() for i in range(0, conn_count): m.add(client, args=(i,)) m.run()

Gracias por cualquier información!