2010-10-17 80 views
6

我想知道是,我是允許這樣做C# - 一個端口上有多個TCP連接?

client_db.clients[numberOfClients].sock = listener.Accept(); 

對於我的網絡課程我正在寫一個聊天客戶端,它連接到服務器。我有一組客戶端對象,其中包含有關連接到服務器的每個人的各種信息。在處理一個客戶端之前,我會讓一個套接字等於listener.Accept,然後我會用這個套接字來做所有的事情。我錯誤地認爲我可以使用一組套接字與多個客戶端建立多個TCP連接。

有沒有辦法做到這一點?我意識到可能有更高效的方法來做到這一點,但是我仍然陷入了網絡編程的困境,更重要的是,我的服務器目前基於使用套接字陣列的想法。如果沒有辦法做到這一點,這當然是我記得的一個教訓。

編輯:我在印象之下,這並沒有工作,因爲我得到了一個異常說「不能有多個連接」,但我再也不能得到這個異常。現在我收到一個對象錯誤。我很困惑,我需要更多的瞭解這個..

+0

請擴大你的第二段,它什麼數據結構和操作您有一個問題不明確。 – Richard 2010-10-17 09:44:19

+1

您是如何得出結論:一系列套接字不起作用? – 2010-10-17 09:47:47

+1

有很多很棒的網絡教程,實現聊天服務器作爲學習線程化網絡的一種方式。這裏有一個:http://www.switchonthecode.com/tutorials/csharp-tutorial-simple-threaded-tcp-server另外,如果你正在爲你的班級做這個,你不應該對自己做一些研究嗎? :) – bzlm 2010-10-17 09:53:50

回答

32

使用TCP,你只能有一個進程在端口上偵聽,但是當它接受連接時(和你的一樣),你會得到一個完全不同的套接字描述符進行會話,因此您可以返回並在原始套接字描述符上偵聽另一個連接。

TCP的唯一性在會話級別。換句話說,5元組(source-ip,source-port,dest-ip,dest-port,protocol)必須是唯一的,以便數據包不會對他們要去的地方感到困惑。

您可以讓成千上萬的客戶端與給定的dest-ip/dest-port對進行對話(如大量人員立刻打到stackoverflow.com:80)。

所以,是的,你允許做你在做什麼。

什麼可能找到的是,如果您嘗試綁定到該端口,但仍有會話處於TIME_WAIT狀態,則不允許綁定。這是爲了阻止來自網絡上一個會話的任何實時數據包進入並破壞會話。在TIME_WAIT

的更多信息,以及爲什麼它的需要可以在this excellent answer找到:-)