2013-01-31 65 views
1

這是我的第一篇文章在這裏,所以請溫柔=)c#異步服務器/客戶端。插座(在客戶端)斷開「隨機」

我正在寫一個數據庫的管理我的辦公室的asynchronuos服務器/客戶端應用程序,我測試它在我的電腦本地,它工作正常。當我在另一臺機器上傳服務器工具時,我發現一些令我瘋狂的事情:服務器/客戶端只處理第一個查詢,當我發送另一個查詢時,服務器和客戶端崩潰。

經過調試模式下的線路後,我發現問題:在beginconnect()(在第二個查詢期間)之後套接字已連接,但是當調試器到達beginsend()行時,套接字斷開連接客戶端,服務器端的套接字似乎連接)。

我不知道它是如何發生的,每當我發送一個新的查詢時,套接字就會重新實例化,當然在查詢過程(發送/接收)完成後關閉並處理它。我的想法是,處理套接字不會立即發生,但過了一段時間(但爲什麼總是在新的beginconnect()和beginsend()之間?)。你有什麼線索嗎?或者我應該在精神病院預留一個房間?

*新的零件(編者)*

well..here了!這次客戶端的套接字對整個會話保持打開狀態(套接字關閉僅在客戶端工具關閉時發生),但我收到另一種錯誤:「System.Net.Sockets.SocketException(0x80004005):現有連接被強制關閉System.Net.Sockets.Socket.EndReceive(IAsyncResult asyncResult)「遠程主機」 經過一些谷歌搜索後,我發現這種錯誤通常是由連接另一端的服務器觸發的,所以我嘗試了「我的」服務器代碼行來確定此連接關閉命令的位置。我發現,該問題可能是在下面的代碼段:

private static void SendCallback(IAsyncResult ar) 
    { 
     Console.WriteLine("send callback"); 
     try 
     { 
      // Retrieve the socket from the state object. 
      Socket handler = (Socket)ar.AsyncState; 

      // Complete sending the data to the remote device. 
      int bytesSent = handler.EndSend(ar); 
      Console.WriteLine("\nQuery answer sent to client"); 

      handler.Shutdown(SocketShutdown.Both); 
      //handler.Disconnect(true); 
      //handler.Dispose(); 
      state.content = new List<byte[]>(); 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e.ToString()); 
      Console.ReadKey(); 
     } 
    } 

刪除handler.shutdown線客戶端不再能夠檢測傳輸的結束(不是真正的問題,是的最後部分發送的數據包,因此可以將其用作觸發器......至少我認爲)。任何建議?我讀了關於Keepalive的一些信息,但我不明白如何設置它,以及在這種情況下是否真的有必要。感謝您的所有努力。

+0

您是否考慮過使用networkcomms.net等網絡庫?這可能爲您節省網絡方面的相當一段時間。這裏有一個很好的例子:http://www.networkcomms.net/creating-a-wpf-chat-c​​lient-server-application/ – MarcF

+0

感謝這個建議,但我已經寫了我的com協議的個人庫我希望能夠解決這個問題,並理解事情的工作方式。 – foxfox

回答

0

我建議不要像你一樣打開和關閉套接字。
請儘可能保持套接字打開,因爲它需要通過程序和操作系統釋放。

+0

我嘗試了這種方法,並且我對它有一個小問題。如果我嘗試在發送/接收之後斷開套接字(不處理它,只是斷開它)操作,我會在同一點收到套接字斷開連接的錯誤消息。這可能是一個與socket..ssuggestion管理不當有關的錯誤? – foxfox

+0

整個問題更多的是套接字在Windows /操作系統層可能會延遲斷開連接,因此不建議斷開/處理。如果你實現這個,那麼處理時間會變得很複雜,直到斷開連接的套接字再次可用。 – weismat

+0

所以我應該直接將它打開並連接?問題是,我不知道用戶可以查看查詢結果多長時間(幾分鐘或幾小時..),因此套接字可以長時間保持連接狀態。這種情況會影響服務器操作嗎? (它應該接受多達10個連接)。也許我不明白套接字是如何工作的...... – foxfox