2012-03-28 2 views
10

С Node.js, мы можем создать сервер и прослушивать произвольный порт:Как Node.js выбирают случайные порты?

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

Первый параметр, порт 0, указывает на то выбрать произвольный порт, и 127.0.0.1 указывает на прослушивание только локальный, as documented.

Удаляет ли Node.js порт, который не используется? Должен ли я проверить, что сам и повторить попытку, если Node.js произойдет, чтобы выбрать порт, который уже открыт и связан с другим приложением? Выбирает ли он любой старый порт или только пользовательские порты (> 1024)?

+0

Я думаю, что он просто назначает случайный порт, но я не 100%. Я думаю, вам нужно сделать ошибку при включении и приращении и т. Д. ... как в ссылке (они повторяют с тем же портом) – bryanmac

+0

Но тогда вам нужно задаться вопросом, что значит запускать какой-либо случайный доступный порт - если у вас нет какое-то открытие сервисов, другим и клиенту трудно обнаружить, что вы случайно обнаружили :) – bryanmac

+0

Это обычно не проблема, так как вы соглашаетесь на порт или используете хорошо известный порт. Если у вас нет разрешения на связывание указанного порта, у вас возникнут другие проблемы. –

ответ

26

ОС назначает номер порта. См. https://github.com/joyent/node/blob/v0.6.11/lib/net.js#L780-783

В OS X назначение является последовательным, пользовательское пространство и не проверяет порт, чтобы убедиться, что он не используется.

На Ubuntu 11.04 назначение является случайным, userland, а также не проверяет, используется ли порт.

Сценарий ниже может использоваться для тестирования на других платформах. Чтобы проверить, что порты являются userland, я запускал сценарий 10 000 раз через bash, переданный в grep -c "port: [0-9] {1,3}" с нулевыми совпадениями.

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);