I’m trying to create a use-once HTTP server to handle a single callback and need help with finding a free TCP port in Ruby.
This is the skeleton of what I’m doing:
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
(It echoes standard input to the first connection and then dies.)
How can I automatically find a free port to listen on?
This seems to be the only way to start a job on a remote server which then calls back with a unique job ID. This job ID can then be queried for status info. Why the original designers couldn’t just return the job ID when scheduling the job I’ll never know. A single port cannot be used because conflicts with multiple callbacks may occur; in this way the ports are only used for +- 5 seconds.
I guess you could try all ports > 5000 (for example) in sequence. But how will you communicate to the client program what port you are listening to? It seems simpler to decide on a port, and then make it easily configurable, if you need to move your script between different enviroments.
For HTTP, the standard port is 80. Alternative ports i’ve seen used are 8080, 880 and 8000.