2017-02-24 344 views
0

我該怎麼辦?關閉套接字?我看不到問題,谷歌沒有幫助 什麼會導致此錯誤?據我所知這是系統類型異常。 ExceptionSocketError:現有連接被遠程主機強制關閉

Console.WriteLine("Connection Recieved"); 
     while (true) 
     { 
      var handler = socket.Accept(); 
      try 
      { 
       while (handler.Connected) 
       { 
        var x = new byte[200000]; 
        try 
        { 
         handler.Receive(x); 
        } 
        catch (Exception ex) 
        { 
         Console.WriteLine(ex.Message); 
         Console.WriteLine(ex.InnerException); 
         Console.WriteLine(ex.StackTrace); 
        } 
        var command = new string(Encoding.UTF8.GetChars(x.Where(t => t != 0).ToArray())); 
        if (string.IsNullOrEmpty(command)) 
        { 
         break; 
        } 
        var data = (Dictionary<string, object>)JsonConvert.DeserializeObject(command, (typeof(Dictionary<string, object>))); 
        if (data["command"].ToString() != "getLog") continue; 
        var response = GetStatus(); 
        handler.Send(Encoding.UTF8.GetBytes(response)); 
       } 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine(ex.Message); 
       Console.WriteLine(ex.InnerException); 
       Console.WriteLine(ex.StackTrace); 
      } 
     } 
+1

問題可能出在連接的另一端。很可能是未處理的異常。 – HebeleHododo

+0

這主要發生在客戶端斷開連接時。 –

+1

[現有連接被遠程主機強行關閉]的可能重複(http://stackoverflow.com/questions/2582036/an-existing-connection-was-forcibly-closed-by-the-remote-host) – HebeleHododo

回答

0

井「以及抽象與協議的多層次網絡」,同時處理各種斷開(軟瞬態:eg.timeout,可恢復:eg.prepaid數據計劃超出限制,瞬時硬件:纖細單薄聯想的rj45插孔得到鬆散的,不可恢復的硬件)...

是一個難題,因爲庫和開發人員和最終用戶每個人都有不同的需求與錯誤狀況有關,這些需求取決於lib或app的使用類型或用途。

John Carmack只是推特了一些關於「抽象5uck」的內容,但在網絡中,每個人都重新實現TLS或其他任何事情都是不合理的。什麼可以看看什麼類型的接口是實用的(一些C傢伙反對流可能是因爲這些錯誤流問題)以及錯誤和警告如何在運行時間流動,並且庫編寫者可以爲編譯器添加提示,即「編譯器流動「,這樣開發人員可以得到警告,哪些類型的錯誤可能會從較低級別傳播,如果存在,則通過抽象進行傳播。多個返回值爲錯誤,狀態和警告傳播提供了一種方式,但支持異常的人認爲異常在不被拋出時會更快,但這可能會導致語言和編譯器的實現 - 例如。 jit可能會轉而在熱循環中使用異常並將異常轉換爲傳播錯誤等。

從C#開始,我遇到的第一件事是如何處理所有可能的斷開連接,並發現..是BCL/C#看起來很不錯,但是惡魔在細節和令人驚訝的運行時異常,這些異常是不同的,並且根據超時/斷開/ cable-unplug/hw-fault等不同地方彈出,這可能是語言和庫可能用作「用例「圍繞它來構建語言和標準庫(以及錯誤,狀態等流程範例),以便他們的用戶更好地瞭解這些內容,而不必猜測哪個錯誤或異常以及它可能支撐的位置。現在試圖增加錯誤處理是很困難的,其中一些條件是越來越少(例如筆記本電腦上的rj45端口 - 大多數情況下都是這樣) - 或者像Surface Books的可拆卸顯示器那樣從一個GPU轉換到另一個等。

這東西很難,抽象往往使它更糟,但我們還需要一些抽象(如網絡協議等)。

事實上,這個東西太難了,如果你尋找它,就「如何爲那些不是John Carmack級別的程序員的人來說,如何讓事情變得更好」而言,沒有太多關於它的文章。我看到一篇演示文稿提示功能性編程可能會有一些答案,但並沒有深入到可能在網絡中發生的所有事情,所以我沒有100%相信這是答案,但這是一個開始。

https://vimeo.com/113707214

這是我看見的表達,而且是啊,能爲一切工作模式(可能更多),我在需求方面概括?

相關問題