ver usando usa una saber que puertos puerto proceso por ocupados liberar esta corriendo como aplicacion abiertos ruby http sockets

ruby - usando - ver puertos abiertos linux



¿Cómo se puede encontrar un puerto de servidor TCP libre usando Ruby? (4)

Intento crear un servidor HTTP de uso único para manejar una única devolución de llamada y necesito ayuda para encontrar un puerto TCP libre en Ruby.

Este es el esqueleto de lo que estoy haciendo:

require ''socket'' t = STDIN.read port = 8081 while s = TCPServer.new(''127.0.0.1'', port).accept puts s.gets s.print "HTTP/1.1 200/OK/rContent-type: text/plain/r/n/r/n" + t s.close exit end

(Hace eco a la entrada estándar a la primera conexión y luego muere).

¿Cómo puedo encontrar automáticamente un puerto libre para escuchar?

Esta parece ser la única forma de iniciar un trabajo en un servidor remoto que luego devuelve la llamada con una identificación de trabajo única. Esta ID de trabajo puede consultarse para obtener información de estado. Por qué los diseñadores originales no pudieron simplemente devolver la identificación del trabajo al programar el trabajo, nunca lo sabré. No se puede usar un solo puerto porque pueden producirse conflictos con múltiples devoluciones de llamada; de esta forma, los puertos solo se usan durante + - 5 segundos.


En realidad, es bastante fácil cuando no intentas hacer todo en una sola línea: - /

require ''socket'' t = STDIN.read port = 8080 # preferred port begin server = TCPServer.new(''127.0.0.1'', port) rescue Errno::EADDRINUSE port = rand(65000 - 1024) + 1024 retry end # Start remote process with the value of port socket = server.accept puts socket.gets socket.print "HTTP/1.1 200/OK/rContent-type: text/plain/r/n/r/n" + t socket.close

Esto logra (palabra fuerte) lo mismo que el fragmento en la pregunta.


No comunicarse en puertos aleatorios. Elija uno predeterminado y hágalo configurable. Los puertos aleatorios son incompatibles con los firewalls. FTP hace esto y el soporte de firewall es una pesadilla: tiene que inspeccionar los paquetes en profundidad.


Pase 0 en para el número de puerto. Esto hará que el sistema elija un puerto para usted fuera del rango de puerto efímero. Una vez que haya creado el servidor, puede solicitar su addr, que contendrá el puerto al que está vinculado el servidor.

server = TCPServer.new(''127.0.0.1'', 0) port = server.addr[1]


Supongo que puedes probar todos los puertos> 5000 (por ejemplo) en secuencia. ¿Pero cómo se comunicará con el programa del cliente qué puerto está escuchando? Parece más sencillo decidir sobre un puerto, y luego hacerlo fácilmente configurable, si necesita mover su script entre diferentes entornos.

Para HTTP, el puerto estándar es 80. Los puertos alternativos que he visto son 8080, 880 y 8000.