首页 文章

远程主机强制关闭现有连接

提问于
浏览
82

我正在使用一个商业应用程序,它正在抛出带有消息的SocketException,

远程主机强行关闭现有连接

客户端和服务器之间的套接字连接会发生这种情况这种连接很活跃,并且正在传输大量数据,但随后又无法断开连接 .

有没有人见过这个?原因是什么?我可以猜出一些原因,但也有任何方法可以在这段代码中添加更多内容以找出原因可能是什么?

欢迎任何意见/想法 .

... 最新的 ...

我有一些.NET跟踪记录,

System.Net.Sockets Verbose: 0 : [8188] Socket#30180123::Send() DateTime=2010-04-07T20:49:48.6317500Z

System.Net.Sockets Error: 0 : [8188] Exception in the Socket#30180123::Send - An existing connection was forcibly closed by the remote host DateTime=2010-04-07T20:49:48.6317500Z 

System.Net.Sockets Verbose: 0 : [8188] Exiting Socket#30180123::Send() -> 0#0

根据日志记录的其他部分,我看到它说'0#0'表示正在发送一个0字节长度的数据包 . 但这究竟意味着什么?

两种可能性中的一种是发生,我不确定,

1)连接正在关闭,但数据随后被写入套接字,从而产生上述异常 . 0#0只表示没有发送任何内容,因为套接字已经关闭 .

2)连接仍然是打开的,并且正在发送零字节的数据包(即代码有错误),0#0表示正在尝试发送零字节的数据包 .

你怎么看?我想这可能是不确定的,但也许其他人见过这种事情?

9 回答

  • 8

    这通常意味着远程端关闭连接(通常通过发送TCP / IP RST 数据包) . 如果您正在使用第三方应用程序,可能的原因是:

    • 您正在向应用程序发送格式错误的数据

    • 由于某种原因,客户端和服务器之间的网络链接正在关闭

    • 您已触发第三方应用程序中导致其崩溃的错误

    • 第三方应用程序已耗尽系统资源

    第一种情况可能就是发生了什么 .

    您可以启动Wireshark以准确查看电线上发生的情况以缩小问题范围 .

    没有更具体的信息,这里的任何人都不可能真正帮助你 .

  • 0

    这不是代码中的错误 . 它来自.Net的Socket实现 . 如果您使用EndReceive的重载实现,如下所示,您将不会得到此异常 .

    SocketError errorCode;
        int nBytesRec = socket.EndReceive(ar, out errorCode);
        if (errorCode != SocketError.Success)
        {
            nBytesRec = 0;
        }
    
  • 0

    使用TLS 1.2解决了这个错误 .
    你可以使用TLS 1.2强制你的应用程序(确保在调用你的服务之前执行它):

    ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12
    

    Another solution :
    在本地计算机或服务器中启用强加密以使用TLS1.2,因为默认情况下它被禁用,因此仅使用TLS1.0 .
    要启用强加密,请使用管理员权限在PowerShell中执行以下命令:

    Set-ItemProperty -Path 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\.NetFramework\v4.0.30319' -Name 'SchUseStrongCrypto' -Value '1' -Type DWord
    Set-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\.NetFramework\v4.0.30319' -Name 'SchUseStrongCrypto' -Value '1' -Type DWord
    

    您需要重新启动计算机才能使这些更改生效 .

  • 66

    解决这个常见烦人问题的简单方法:

    只需转到“.context.cs " file (located under " .context.tt " which located under your " * .edmx”文件即可 .

    然后,将此行添加到构造函数中:

    public DBEntities() 
            : base("name=DBEntities") 
        { 
            this.Configuration.ProxyCreationEnabled = false; // ADD THIS LINE !
        }
    

    希望这是有帮助的 .

  • 17

    有同样的错误 . 实际上工作以防使用一些代理(在我的情况下是小提琴手)发送流量 . 将.NET框架从4.5.2更新到> = 4.6,现在一切正常 . 实际的要求是:
    new WebClient().DownloadData("URL");
    例外是:

    SocketException:远程主机强制关闭现有连接

  • 0

    我有这个例外,因为实体中的循环引用 . 在实体中看起来像

    public class Catalog
    {
        public int Id { get; set; }
        public int ParentId { get; set; }
        public Catalog Parent { get; set; }
        public ICollection<Catalog> ChildCatalogs { get; set; }
    }
    

    我将[IgnoreDataMemberAttribute]添加到Parent属性 . 这解决了这个问题 .

  • 7

    当我尝试从枚举列中具有null的数据库中读取一行时,我遇到此异常,它无法将null映射到枚举值 .

  • 0

    我遇到了这个异常,当类的DateTime属性没有得到值时 . 我只需将其置为可空的DateTime并找到解决方案 .

    public class PlanningBoardBO
        {
            ... Other Properties ...
    
            public DateTime? PickupDate { get; set; }
    
            ... Here changed DateTime to DateTime?
        }
    
  • 24

    每当我在不到10秒内没有发送或接收数据时,我的应用程序就会发生此错误 .

    这是由使用前向打开方法引起的 . 您可以通过使用其他方法来避免这种情况,或者安装保持前向打开连接的更新速率低于10秒 .

相关问题