操作系统分配端口号。请参阅https://github.com/joyent/node/blob/v0.6.11/lib/net.js#L780-783
在OS X上,分配是顺序的,userland,并且不检查端口以验证端口未被使用。
在Ubuntu 11.04上,这个任务是随机的,userland,也不检查端口是否在使用中。
下面的脚本可以用于在其他平台上测试。要验证端口是userland,我通过bash管理脚本10,000次,以零匹配传输到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);
我认为它只是分配一个随机端口,但我不是100%。我想你需要做的错误和增量等...就像在链接(他们重试与相同的端口虽然) – bryanmac 2012-03-28 05:18:51
但是,你必须想知道什么意思启动一些随机可用的端口 - 除非你有某种类型的服务发现,其他人和客户很难发现你随机发现的东西:) – bryanmac 2012-03-28 05:20:39
这通常不是一个问题,因为您同意某个端口或使用知名端口。如果您没有绑定所述端口的权限,那么您还有其他问题需要解决。 – 2012-03-28 08:41:23