2012-03-28 6 views
10

, bir sunucu oluşturmak ve rastgele bağlantı noktasında dinleyebilirsiniz:Node.js rasgele bağlantı noktalarını nasıl seçer? Node.js ile

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

ilk parametre, port 0, rasgele bir bağlantı noktası seçmek belirtir ve 127.0.0.1 sadece as documented localhost dinlemek için gösterir.

Node.js, kullanılmayan bir bağlantı noktasını seçiyor mu? Bunu kendim kontrol etmek zorunda mıyım ve önceden açık olan ve başka bir uygulamaya bağlı bir port seçmek için Node.js yapılırsa tekrar denemeliyim? Eski bir liman mı yoksa sadece kullanıcı limanı mı (> 1024)?

+0

Sadece rastgele bir bağlantı noktası atar ancak% 100 değilim. Ben hata ve artış vb yapmak gerekir ... bağlantı gibi (onlar aynı port ile tekrar denemek) – bryanmac

+0

yapmalısınız Ama sonra sen-ebilmek var olmak zorunda değilsiniz rasgele kullanılabilir bağlantı noktasında başlamak için ne anlama geldiğini merak ediyorum Bir çeşit hizmet keşfi, başkaları ve müşterinin rastgele bulduğunuz şeyi keşfetmesi zor. :) – bryanmac

+0

Bu, genellikle bir bağlantı noktasında anlaştığınız veya iyi bilinen bir bağlantı noktası kullandığınız için sorun değildir. Söz konusu bağlantı noktasını bağlama izniniz yoksa, çözmek için başka sorunlarınız var demektir. –

cevap

26

İşletim sistemi bağlantı noktası numarasını atar. Bkz. https://github.com/joyent/node/blob/v0.6.11/lib/net.js#L780-783

OS X'de, atama sırayla, kullanıcı arabirimidir ve kullanılmadığını doğrulamak için bağlantı noktasını denetlemez.

Ubuntu 11.04 üzerinde, atama rasgele, kullanıcı arabirimi ve ayrıca bağlantı noktası kullanımda olup olmadığını denetlemez.

Aşağıdaki kod, diğer platformlarda test etmek için kullanılabilir. Bağlantı noktalarının userland olduğunu doğrulamak için, betik bash ile 10,000 kez grep -c "bağlantı noktası: [0-9] {1,3}" ile sıfır eşleşmelerde koştum.

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