2012-12-17 124 views
1

這是我的聽力功能和連接功能C#異步套接字概念

Socket Listen 

public void Listen(){ 
IPEndPoint ep = new IPEndPoint(IPAddress.Any, PortNumber); 
Listen.Bind(ep); 
Listen.Listen(10); 
Listen.BeginAccept(new AsyncCallback(NewConnection), null);} 

public void NewConnection(IAsyncResult asyn) 
{ 
    Socket Accepted = Listen.EndAccept(asyn); 
    Listen.BeginAccept(new AsyncCallback(NewConnection), null); 
    SomeFunction(Accepted); 
} 

代碼工作正常,沒有任何問題 - 我跟蹤代碼,看看如何與不同的客戶工作,我理解的流程。但是,我不明白1套接字如何爲不同的客戶端提供服務。 它通過套接字在客戶端之間複用嗎?

我在MSDN上讀到Accepted在我的代碼中只能用於已建立的連接,不能再繼續使用 - 那部分我不明白。客戶端嘗試連接到服務器套接字時實際發生了什麼? EndAccept是否返回一個完全不同的套接字與不同的端口建立連接,並保持同一個套接字監聽同時接受更多的請求?

回答

1

基於我的理解,你所說的基本上是正確的。 Accepted插座與Listen不一樣。在EndAccept之後,您可以使用偵聽套接字啓動另一個BeginAccept異步調用,並且可以使用新創建的套接字與遠程對等方進行通信。

要驗證,您可以檢查偵聽套接字的本地端口和連接的套接字;他們應該是不同的。

+0

謝謝我會試試你說的 –

+0

我調試2個不同的客戶端,同時試圖連接到同一臺服務器,他們都連接到不同的端口,但服務器處理它們都有相同的端口,我不明白如何 –

+0

每個套接字(服務器和客戶端)都有一個本地端點和一個遠程端點。我相信,這些端點可能與您預期的方式不匹配。因此,如果客戶端在端口4000上連接到服務器,則客戶端的遠程端點端口爲4000,但服務器的本地端點端口可能不是4000.這是您的意思嗎? (此外,客戶端的本地端點端口有點隨意分配 - 某人理解得比我能解釋得更好,但最有可能不會是4000) – mztan