2012-03-18 52 views
0

我有一個連接到服務器的客戶端,開始發送二進制數據,當它完成發送時,它會關閉連接。如果連接關閉,服務器知道客戶端已完成發送文件。如果連接提前關閉,接收所有數據

我有一個簡單的tcp類來處理連接。然後,我有將數據發送到服務器的另一個功能:

TcpC tcp = new TcpC(); 

    void send_data_to_server(){ 
     tcp.connect(); 

     while(read_data){ 
      tcp.sendData(); 
     } 

     Thread.Sleep(500); 
     tcp.disconnect(); 
    } 

Server使用異步插座具有如下功能:WaitForData(),它變得異常,當客戶端斷開連接。問題是如果我刪除Thread.Sleep()WaitForData仍然捕獲異常,但onDataReceive仍然沒有收到所有的數據,因爲我檢查異常的緩衝區大小,它比我使用Sleep()小得多。

服務器將不得不處理像這樣的許多操作,我不能使用Sleep()'hack'來使其工作。有時它無法工作,我必須將睡眠間隔設置爲幾秒鐘才能確定。除WaitForData()之外,服務器端的其他異步函數都不會觸發異常。

如何立即關閉連接並仍能獲取所有數據?我雖然tcp.disconnect在所有的數據發送後調用,所以我不清楚爲什麼我有這個問題。謝謝!

回答

2

從MSDN文檔:

爲了確保所有數據的發送和接收套接字被關閉之前,您應該調用Disconnect方法之前調用關機。

它可能是值得給予一槍。否則,如果你的代碼片段有任何跡象(根據你使用的TcpC),你應該使用TcpClient.Close,我相信它會爲你做到這一點。

+0

再次感謝!奇怪地使用關閉不會導致任何異常在服務器端觸發,但我可以通過檢查onDataReceived傳入數據計數確定連接是否關閉,因此沒什麼大不了的。 – user1015551 2012-03-18 02:12:12

+1

我以前使用過TcpClient.Close()。關機解決了我的問題,謝謝! – user1015551 2012-03-18 02:20:55

+0

除了進行半關閉關閉之外,如果您想絕對確定客戶端獲取了您想要發送的數據,則應該等待客戶端在正式關閉套接字之前先斷開連接(具有合理的超時)。 – selbie 2012-03-18 06:21:19