2012-03-28 11 views
10

Con Node.js, podemos crear un servidor y escuchar en un puerto aleatorio:¿Cómo elige Node.js los puertos aleatorios?

var server = net.createServer(); 
server.listen(0, '127.0.0.1'); 

El primer parámetro, el puerto 0, indica elegir un puerto aleatorio y 127.0.0.1 indica en localhost solamente, as documented.

¿Selecciona Node.js un puerto que no está en uso? ¿Tengo que verificarlo yo mismo y volver a intentar si Node.js pasa a elegir un puerto que ya está abierto y vinculado a otra aplicación? ¿Escoge un puerto viejo, o solo puertos de usuario (> 1024)?

+0

Creo que simplemente asigna un puerto aleatorio pero no soy 100%. Creo que necesitas hacer el error e incrementar, etc ... como en el enlace (sin embargo, intentan nuevamente con el mismo puerto) – bryanmac

+0

Pero luego debes preguntarte qué significa iniciar en un puerto aleatorio disponible, a menos que tengas algún tipo de descubrimiento de servicio, es difícil para los demás y el cliente descubrir lo que encontró al azar :) – bryanmac

+0

Eso no suele ser un problema ya que estaría de acuerdo con un puerto o utilizaría un puerto conocido. Si no tiene permiso para enlazar dicho puerto, entonces tiene otros problemas que resolver. –

Respuesta

26

El sistema operativo asigna el número de puerto. Ver https://github.com/joyent/node/blob/v0.6.11/lib/net.js#L780-783

En OS X, la asignación es secuencial, userland y no verifica el puerto para verificar que no esté en uso.

En Ubuntu 11.04, la asignación es aleatoria, userland y tampoco comprueba si el puerto está en uso.

El siguiente script se puede utilizar para probar en otras plataformas. Para verificar que los puertos son userland, ejecuté el script 10,000 veces vía bash canalizado a grep -c "port: [0-9] {1,3}" con cero coincidencias.

var net = require('net'), 
    firstPort; 

(function createServer(port) { 
    var server = net.createServer(); 
    server.listen(port, function() { 
    address = server.address(); 
    if (port === 0) { 
     if (firstPort === undefined) { 
     firstPort = address.port; 
     // cause a EADDRINUSE in 10 more sockets for sequential platforms 
     // without this, will run out of fd's before hitting EADDRINUSE 
     createServer(firstPort + 10); 
     console.log('addr in use port trap: ', firstPort + 10); 
     } else { 
     // on OS X (sequential) this will increment the OS's sequential counter 
     // and not cause EADDRINUSE 
     createServer(address.port + 1); 
     } 
     createServer(0); 
    } 
    console.log("requested port:", port, " binded port:",address.port); 
    }); 
})(0); 
Cuestiones relacionadas