Servidor Python “Normalmente solo se permite un uso de cada dirección de socket”

Estoy tratando de crear un servidor muy básico en Python que escucha en un puerto, crea una conexión TCP cuando un cliente intenta conectarse, recibe datos, envía algo de vuelta, luego escucha de nuevo (y repite el proceso indefinidamente). Esto es lo que tengo hasta ahora:

from socket import * serverName = "localhost" serverPort = 4444 BUFFER_SIZE = 1024 s = socket(AF_INET, SOCK_STREAM) s.bind((serverName, serverPort)) s.listen(1) print "Server is ready to receive data..." while 1: newConnection, client = s.accept() msg = newConnection.recv(BUFFER_SIZE) print msg newConnection.send("hello world") newConnection.close() 

A veces esto parece funcionar perfectamente bien (si apunto mi navegador a “localhost: 4444”, el servidor imprime la solicitud HTTP GET y la página web imprime el texto “hola mundo”). Pero recibo esporádicamente el siguiente mensaje de error cuando bash iniciar el servidor después de cerrarlo en los últimos minutos:

 Traceback (most recent call last): File "path\server.py", line 8, in  s.bind((serverName, serverPort)) File "C:\Python27\lib\socket.py", line 224, in meth return getattr(self._sock,name)(*args) error: [Errno 10048] Only one usage of each socket address (protocol/network address/port) is normally permitted 

Estoy progtwigndo en Python usando Windows 7. ¿Alguna idea sobre cómo solucionar esto?

Habilite la opción de socket SO_REUSEADDR antes de llamar a bind (). Esto permite que la dirección / puerto se reutilice inmediatamente en lugar de quedarse atascado en el estado TIME_WAIT durante varios minutos, a la espera de que lleguen los paquetes finales.

 s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1) 

En Windows, puedes probar estos pasos:

1. Compruebe qué proceso utiliza el puerto.

 # 4444 is your port number netstat -ano|findstr 4444 

obtendrá algo como esto:

 # 19088 is the PID of the process TCP 0.0.0.0:4444 *:* 19088 

2. mata este proceso

 tskill 19088 

Buena suerte.

En el artículo publicado por @JohnKugelman se afirma que incluso después de habilitar SO_REUSEADDR no puede usar el socket para conectarse al mismo extremo remoto que antes:

SO_REUSADDR le permite usar un puerto atascado en TIME_WAIT, pero aún no puede usar ese puerto para establecer una conexión con el último lugar al que se conectó.

Veo que solo estás probando / jugando. Sin embargo, para evitar este error, debe asegurarse de terminar la conexión correctamente. También puede alterar los tiempos de TCP del sistema operativo: http://www.linuxquestions.org/questions/linux-networking-3/decrease-time_wait-558399/

Para propósitos de prueba, también estaría bien si solo cambiara su serverPort de forma serverPort , ¿qué piensa?

Es importante (específicamente en Windows) cerrar el socket. De lo contrario, tendrá que esperar a que se agote el tiempo de espera después de cerrar Python.

Haría:

 try: while 1: newConnection, client = s.accept() msg = newConnection.recv(BUFFER_SIZE) print msg newConnection.send("hello world") newConnection.close() finally: s.close() 

¿ayuda?

Si está intentando volver a ejecutar el servidor sin detener el último instante del servidor, no funcionará. Si quieres detener el instante actual ve a

shell -> reiniciar shell.

Si ya ha cerrado el shell sin detener el servidor, vaya al administrador de tareas y finalice el proceso de python en los procesadores en segundo plano. Esto detendrá el último instante de su servidor.

Cambié mi número de puerto a uno diferente y funciona.

 if __name__ == '__main__': socketio.run(app, debug = True, use_reloader = False, port=1111)