2011-10-05 68 views
1

我的TCPListener配置是這樣的:的TCPListener藍調,想不通爲什麼連接不正確關閉

this.tcpListener = new TcpListener(IPAddress.Any, config.portNum); 

然後我(使用線程)設置一個監聽器函數是這樣的:

private void ListenForClients() 
    { 
     this.tcpListener.Start(); 

     while (true) 
     { 
     //blocks until a client has connected to the server 
     TcpClient client = this.tcpListener.AcceptTcpClient(); 

     //create a thread to handle communication 
     //with connected client 

     ThreadStart starter = delegate { HandleClientComm(client, this.DBGrid); }; 
     Thread thread = new Thread(starter); 
     thread.Start(); 
     } 
    } 

圍繞它的作品第一次,第二次我火了,我得到這個錯誤信息:

每個套接字地址(協議/網絡地址/端口)的一個用法通常 允許

線程裏面有一個叫關閉:

tcpClient.Close(); 

但它似乎並沒有釋放該端口了,有什麼建議?

+0

您獲得這種懷疑的特定代碼行是什麼? – user957902

+0

this.tcpListener.Start();第二次造成問題。 –

+1

您是否在同一個進程中多次調用tcpListener.Start,或者一旦關閉了進程並重新啓動它,就會出現錯誤? – user957902

回答

2

如果您反覆打電話給ListenForClients,那是您問題的根源,而不是客戶端連接不正確Close()

傳統上,一個線程將處理打開主套接字並接受「子」連接套接字。所以你的ListenForClients應該在主服務器線程中,並且每個應用程序只調用一次。

一些更多的信息:

this.tcpListener.Start(); 

創建在你指定的端口狠狠地聆聽。隨着每一個客戶端連接,

TcpClient client = this.tcpListener.AcceptTcpClient(); 

線將創建連接,是一個完全不同的端口上的一個新的插座。所以通過關閉你的客戶端,你根本不會釋放主套接字。提供應用服務

http://en.wikipedia.org/wiki/Internet_socket#Socket_states_and_the_client-server_model

計算機過程被稱爲服務器,創建啓動時是處於監聽狀態套接字。這些套接字正在等待來自客戶端程序的計劃。對於偵聽的TCP套接字,由netstat表示的遠程地址可以表示爲0.0.0.0,遠程端口號爲0.

TCP服務器可以同時爲多個客戶端提供服務,方法是爲每個客戶端創建子進程並建立TCP子進程和客戶端之間的連接。爲每個連接創建獨特的專用套接字。當通過遠程套接字建立套接字 - 虛擬連接或虛擬電路(VC)(也稱爲TCP會話)時,這些處於建立狀態,從而提供雙工字節流。

2

問題出在tcpListener.Start()。您不允許在同一個端口上擁有2個偵聽器。 ListenForClients方法只能在您的應用程序中調用一次

相關問題