2009-11-20 223 views
8

我有一個TcpClient對象,它使用底層的NetworkStream.Write()向服務器發送一些數據。爲此 ,我有:關閉TCP連接的正確方法是什麼

TcpClient server = new TcpClient(serverName, 50001); 

/* ... */ 

NetworkStream stream = server.GetStream(); 

現在,當按下一個按鈕,連接應該關閉。 關閉連接的正確方法是什麼? MSDN文檔說,關閉TcpClient(使用.Close())實際上並不關閉套接字,只關閉TcpClient資源(這至少是我理解文檔的方式)。

那麼,會不會正確地關閉連接的下一個代碼?

stream.Close(); 
server.Close(); 

難道這還不夠,還是應該首先檢查(在某種程度上)如果流(或服務器)可以關閉(如果連接是半開或東西)......

更,NetworkStream.Close() MSDN文檔聲明它釋放資源(即使是套接字),所以也許關閉流就足夠了,因爲我阻止在那之後使用TcpClient。

什麼是正確的方法?

回答

6

由於the docs說:

調用此方法將最終導致在相關插座的接近,也將關閉關聯的NetworkStream用來發送和如果創建接收數據。

所以server.Close();就足夠了。

首先關閉NetworkStream不會傷害。

順便說一句,如果你碰巧是隻有一個方法使用的TcpClient,它包裝在一個using()語句,這樣你肯定Dispose()(相當於Close())被調用就可以了,即使引發異常等。

+1

我想我太信任智能感知了。 TcpClient.Close()的彈出窗口聲明:「放棄此System.Net.Sockets.TcpClient實例而不關閉底層連接。」奇怪的事情。感謝您的回覆。 – 2009-11-20 09:26:51

+0

的確,這就是3.0文檔(http://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient.close(VS.85).aspx)在第一句中所說的......但接着第三句說它*關閉Socket和NetworkStream。 3.5文檔(我之前鏈接的)是一致的。我懷疑3.0文檔中的行是一個錯誤。 – Joren 2009-11-20 09:32:41

0

你是正確的關閉流然後服務器。正如文檔所述,這應該會導致所有套接字隨着時間成功關閉。然而,幾個頭部抓撓的蟲子教會了我隨着時間的推移重要的一課:

別忘了沖洗!

stream.Flush(); 
stream.Close(); 
server.Close(); 

你會經常失去你以爲你可能已經以其他方式發送了一些數據。這還有助於確保在關閉流時該流應該爲空且處於非活動狀態。

+9

來自NetworkStream上的文檔:「Flush方法實現Stream.Flush方法;但是,因爲NetworkStream沒有緩衝,所以它不會影響網絡流,調用Flush方法不會引發異常。 因此,如果您刷新流或沒有真正的問題。 – Joren 2009-11-20 09:29:05

3

我會將TCP連接與套接字相關聯。

通常,該過程是這樣的:與SocketShutdown.Send參數 3.環路上接收,直到它返回0或失敗,異常 1完成發送數據 2.呼叫Socket.Shutdown。調用close()

下面是僞代碼一個小樣本,這是非常類似於C#:)

void CloseConnection(Socket socket) 
{ 
    socket.Send(/*last data of the connection*/); 
    socket.Shutdown(SocketShutdown.Send); 

    try 
    { 
     int read = 0; 
     while((read = socket.Receive(/*application data buffers*/)) > 0) 
     {} 
    } 
    catch 
    { 
     //ignore 
    } 
    socket.Close(); 
} 

如果第一和第三步驟被跳過 - 數據丟失可能發生。

取自How to close TCP socket

+0

正是我需要的,謝謝!在我的情況下,其他答案不起作用。這可能是因爲在某些情況下,我沒有從客戶端讀取所有可用的數據(在某些情況下,我會在讀取所有數據之前返回錯誤,然後關閉連接)。使用這種方法,它開始關閉,然後讀取任何其他等待的數據。 – eselk 2013-09-15 12:27:13

相關問題