2011-10-14 92 views
0

我使用pidgin,A,B和C運行多個bonjour客戶端。
當B和C對話時,我發現A使用相同的端口(使用wireshark我可以看到數據包) MDNS和通信,
但B和C,每一個具有兩個不同的端口一個用於MDNS,一個用於套接字連接。
A如何工作,爲什麼它只能用一個端口工作?一個端口如何提供多個連接?
注意:如果是多線程,那麼當它接受它會創建另一個自由港新的套接字連接,但我看到Wireshark的數據包,客戶端A所做的僅僅是使用相同的端口進行通信和MDNS。 (source_address,source_port,的destination_address,destination_port):
一個端口上的多個連接

回答

5

TCP連接實際上是由元組來標識。所以只要其中一個不同就沒有問題了。

在實踐中,你說會發生什麼,當一個程序監聽在給定的端口的連接:任何新的連接使用相同的服務器端口(但不同的客戶地址或端口)創建的。

對於exmample,在我的Linux機器,在那裏我有一個Web服務器偵聽端口80:

$ telnet localhost 80 & 
$ telnet localhost 80 & 
$ lsof -n -i TCP 
... 
TCP 127.0.0.1:45601->127.0.0.1:80 
TCP 127.0.0.1:45602->127.0.0.1:80 
+0

感謝,但是當我嘗試使用端口5298連接到在同一臺機器上其他幾個端口, java套接字,有「地址已被使用」的異常?你說如果元組中的任何元素髮生變化,它應該沒問題,這怎麼會發生?那麼我嘗試了另一個指定的本地端口5555,我有「連接被拒絕」?我們不能指定本地端口嗎?還是應該在創建套接字之前對本地指定的端口執行一些操作?我嘗試在IPTABLE中禁用此端口,但它不起作用! – seaguest

+3

好吧,我說如果元組中有元素髮生變化,那麼TCP協議就沒關係了。但套接字API有其他的限制:你不能綁定到同一個本地地址/端口不止一次(除非你設置SO_REUSEADDR選項,但這有其他更微妙的影響)。因此「地址已被使用」錯誤。當您嘗試連接到目標地址/端口並且該端口中沒有監聽時,會發生「連接被拒絕」錯誤。 – rodrigo

+0

非常感謝您的回答!事實上我解決了這個問題,因爲我不知道MDNS使用默認端口5353,並且我配置了一個用於socket的錯誤端口。所以現在它工作得很好!再次感謝您的熱烈回答! – seaguest

相關問題