2017-02-24 345 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

这是我看见的表达,而且是啊,能为一切工作模式(可能更多),我在需求方面概括?

相关问题