Как Node.js выбирает случайные порты? - PullRequest
11 голосов
/ 28 марта 2012

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

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

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

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

Ответы [ 2 ]

26 голосов
/ 22 апреля 2012

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

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

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

Приведенный ниже скрипт можно использовать для тестирования на других платформах.Чтобы убедиться, что порты принадлежат пользователю, я запустил скрипт 10000 раз через 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);
5 голосов
/ 17 января 2019

Выбирает ли Node.js порт, который не используется?

Да, порт будет доступным. операционная система выбирает порт, который не используется, а не Node.js, но с точки зрения конечного пользователя это более или менее то же самое.

Документация, без сомнения, имела другую формулировку в то время, когда этот вопрос был первоначально опубликован в 2012 году, но на данный момент (январь 2019 года), явно говорит об этом : "Если порт не указан или равен 0 , операционная система назначит произвольный неиспользуемый порт ... ".

Должен ли я сам это проверить и повторить попытку, если Node.js выберет порт, который уже открыт и привязан к другому приложению?

Нет, нет. Вы должны обрабатывать ошибки в любом случае, так как любое количество вещей может пойти не так. Но написание дополнительного кода для проверки доступности порта - это не то, что вам нужно.

Он выбирает какой-либо старый порт или только порты пользователя (> 1024)?

Насколько я знаю, это всегда будет непривилегированный порт.


Для операционных систем, таких как macOS, которые назначают доступные порты последовательно, вот код, который показывает, что операционная система пропустит порт, если он недоступен.

// Testing for macOS, which supplies available ports sequentially.

var net = require('net');

createServer(0, function () {
  var port = this.address().port;
  console.log('server was assigned port ' + port);
  createServer(port+1, function () {
    var port = this.address().port;
    console.log('server was assigned port ' + port);
    createServer(0, function () {
      var port = this.address().port;
      // This line will show that the OS skipped the occupied port and assigned the next available port.
      console.log('server was assigned port ' + port);
    });
  });
});

function createServer(port, callback) {
  console.log('create server with port ' + port);
  var server = net.createServer();
  server.listen(port, callback).unref();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...