¿Cómo hago que un servidor escuche en varios puertos?

Me gustaría escuchar en 100 puertos TCP diferentes con el mismo servidor. Esto es lo que estoy haciendo actualmente:

import socket import select def main(): server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) for i in range(1000,1100): server_socket.bind(('127.0.0.1', i)) server_socket.listen(1) read_list = [server_socket] while True: readable, writable, exceptional = select.select(read_list, [], read_list) for s in readable: if s is server_socket: #print "client connected" client_socket, address = server_socket.accept() read_list.append(client_socket) else: # One of the tcp clients data = s.recv(1024) if not result: s.close() read_list.remove(s) #print "client disconnected" if __name__ == "__main__": main() 

Devuelve un error que dice Permission Denied . ¿Es porque algunos puertos (1000-1100) están reservados y no están asignados a él o por algún otro motivo?

Lo intenté con (8000-8100) y dice Invalid Arguments

Editado

 import socket import select def create_socket(TCP_PORT): server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) server_socket.bind(('127.0.0.1', TCP_PORT)) server_socket.listen(1) return server_socket def main(): read_list = [] for TCP_PORT in range(8000,8100): read_list.append(create_socket(TCP_PORT)) while True: readable, writable, exceptional = select.select(read_list, [], read_list) for s in readable: if s is server_socket: #print "client connected" client_socket, address = server_socket.accept() read_list.append(client_socket) else: # One of the tcp clients data = s.recv(1024) if not result: s.close() read_list.remove(s) #print "client disconnected" if __name__ == "__main__": main() 

Hay 2 problemas.

  1. Los puertos por debajo de 1024 están reservados. (Necesitará privilegios especiales, por ejemplo, privilegios de raíz para enlazar a dicho puerto).

  2. Un socket solo puede escuchar en un puerto. Entonces, para escuchar varios puertos, necesita crear un socket por puerto.

Encontrará una buena explicación aquí: escuche múltiples puertos desde un servidor . Es para C pero el problema en Python es el mismo.

Así que la respuesta será la misma:

  • un socket por puerto
  • una escucha por toma
  • una sola selección

Por cierto, los puertos por debajo de 1024 están reservados en sistemas Unix (y similares a Unix): necesita privilegios de root para usarlos. En Windows, no hay tales restricciones.

Con respecto al segundo problema, el uso de los puertos 8000-8100 genera un Invalid argument , esto ocurre si intenta volver a enlazar un socket ya enlazado sin volver a crear el socket. Sin embargo, no hay problema con ese rango de puertos.

 >>> s=socket.socket() >>> s.bind(('localhost', 8001)) >>> s.bind(('localhost', 8001)) Traceback (most recent call last): File "", line 1, in  File "/usr/lib64/python2.7/socket.py", line 224, in meth return getattr(self._sock,name)(*args) socket.error: [Errno 22] Invalid argument >>> s.close() >>> s.bind(('localhost', 8001)) Traceback (most recent call last): File "", line 1, in  File "/usr/lib64/python2.7/socket.py", line 224, in meth return getattr(self._sock,name)(*args) File "/usr/lib64/python2.7/socket.py", line 170, in _dummy raise error(EBADF, 'Bad file descriptor') socket.error: [Errno 9] Bad file descriptor >>> s=socket.socket() >>> s.bind(('localhost', 8001))