2012-12-05 18 views
7

Bazı garip sonuçlara yol açan netcat ile belirli portları dinleyerek Jenkins'de OS'deki bağlantı noktası tahsisi sorunlarını ayıklamaya çalışıyordum. bir ikinci terminal sonraOS X neden aynı TCP bağlantı noktasını iki kez dinlemeye izin veriyor?

$ uname -rs 
Darwin 12.2.1 

$ nc -l 54321 

: X, 10.8.2 işletim sistemi bir terminalde


$ nc -l 54321

ve üçüncü terminalde

, lsof her iki örneğini göstermektedir aynı bağlantı noktasına bağlı:

$ lsof -i | grep 54321 
nc 70706 chris 3u IPv4 0x55618c024692f4d1  0t0 TCP *:54321 (LISTEN) 
nc 70769 chris 3u IPv4 0x55618c0232cb8661  0t0 TCP *:54321 (LISTEN) 
Linux'ta

:

İlk terminali:

$ uname -rs 
Linux 3.2.0-34-generic 

$ nc -l 54321 

İkinci terminali:

$ nc -l 54321 
nc: Address already in use 

Neden OS X ayrıca adres geçtiği anlamına bildirmez kullanılır?

+1

"lsof -i" çıktı sözdizimini bilmiyorum, ancak 0x55618c024692f4d1 ve 0x55618c0232cb8661 nedir? IP adresleri ise, açıkçası dinleyicinin "herhangi bir" adrese değil belirli bir IP adresine bağlı olması açıktır. – CodeCaster

+0

Anlamsız bellek adresleri. Sahip oldukları tek amaç, bunların iki ayrı soket olduğunu (örn., Bir fork() 'veya' dup() ') olmadığını tanımlamaktır. – duskwuff

+0

'lsof -i 'işlevinin çalıştırılması, bu alan için 27 benzersiz değer verir (" DEVICE "); Bunun bir hafıza adresi olduğuna inanıyorum. Son sütun, soketlerin * * 'ye bağlı olduğunu gösterir. –

cevap

6

OS X'deki ikili, tamamen yinelenen bağlantılara izin veren SO_REUSEPORT soketi seçeneğini ayarlıyor (setsockopt on OS X). OS X üzerinde dtrace'yi kullanarak bunu doğrulayabilirsiniz.

Linux'taki netcat ikili yazılımı bunu yapmaz, beklendiği gibi bir bağlama hatası alırsınız. Yine, strace kullanarak doğrulayabilirsiniz. SO_REUSEPORT'un daha yeni Linux çekirdeklerinde kullanılmamasına veya kullanılmamasına inanmıyorum.

+0

Bilgi için teşekkürler! Bu da, bir başka yazılım parçasının çalışıp çalışmadığını niçin açıkladığını da açıklıyor, nc' * * portun zaten kullanımda olduğundan şikayet ediyor. –

+0

Bilgi için, SO_REUSEPORT soket seçeneği Linux 3.9'a eklendi: https://lwn.net/Articles/542629/ –

İlgili konular