2011-10-17 72 views
1

我有一些關於套接字編程的基本問題。我正在嘗試編寫一個程序(在C,linux中),其中幾個客戶端進程連接到一個服務器進程,並且客戶端也需要連接到它們自己。雖然客戶端將駐留在不同的機器上,但他們在同一臺機器上也是如此。這些是我的問題。同一臺機器上的兩個進程可以連接到同一個端口嗎?

  1. 兩個客戶端進程可以在單獨的端口上相互通信嗎?在這種情況下,它們都不會監聽端口(比如服務器如何)。他們只需使用套接字連接到一個端口並相互通話。那可能嗎?

  2. 如果不是,我該如何在客戶端之間進行通信?

任何想法都是有幫助的。謝謝。

+0

@PaulR,我對此沒有意見,我剛剛發佈了一個我認爲可能對您有興趣的鏈接。 – TMS

+2

感謝Paul R.我對這個論壇很陌生,我對這裏的規則並不熟悉。謝謝你指出。 –

回答

2
  1. 沒有,在TCP這是不可能的。在TCP中建立連接時,您始終連接到偵聽端口,因此其中一個客戶端必須在之間偵聽。

  2. 其中一個客戶端需要打開偵聽端口,但哪一個? 使用服務器作爲仲裁者!採用其中服務器緩和的協議:

    • 服務器決定哪個客戶端將打開端口
    • 該客戶端打開該端口,偵聽它和發送其地址(主機:端口)發送到服務器
    • 服務器發送它給另一個客戶端
    • 另一個客戶端可以連接!

如果你問如果兩個進程可以在同一臺機器上相同的端口上偵聽,那麼答案是否定的。但使用上述協議可以避免這種情況。

+0

優秀的解釋。謝謝。我只是想知道是否有辦法讓客戶端獨立於服務器之間建立連接......想想看,現在聽起來有點奇怪...... –

1

套接字連接總是需要一個連接和一個監聽端 - 一方需要監聽。讓一個客戶端進程創建一個偵聽端口,另一個連接到此端口。

+1

如果兩個客戶端同時連接,實際上兩個客戶端可以相互連接,請參見第30頁上的[RFC793](http://www.ietf.org/rfc/rfc793.txt),同時啓動 – Hasturkun

+0

,但有沒有API來實現這個可靠的。在NAT後面連接兩個節點會很酷。 –

+1

如果雙方都知道對方的端口和大致相同的「連接()」,那麼它的工作可靠性就足夠了。但是,這可能需要一些調解器,並且可能會惹惱做NAT的系統。 – Hasturkun

1
  1. 如果您希望讓客戶端彼此通信,請使用偵聽端口並指向另一個客戶端的服務器,而不是直接指向正確的客戶端。
  2. 如果你不想使用服務器,那麼在你的客戶端應用程序中,你必須使一個端口用於偵聽,另一個端口用於隨地吐痰數據。所以這隻會是一個人談話。

如果我對你正在尋找的答案是正確的:是的,同一臺機器上的兩個進程可以連接到同一端口。只是兩個不同的實體試圖連接到服務器。

相關問題