当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《远程主机强制关闭现有连接》经验,为你挑选了5个好方法。

我正在使用一个商业应用程序,它正在抛出带有消息的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表示正在尝试发送一个零字节的数据包.

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



1> RarrRarrRarr..:

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

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

客户端和服务器之间的网络链接由于某种原因而下降

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

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

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

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

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


请注意,"发送格式错误的数据"可能意味着向`http`服务器发送`https`请求,反之亦然.
您应该能够通过IP地址和端口号过滤Wireshark转储,至少.在那之后,查看流的末尾(出现问题)可能是最有帮助的,然后向后工作,直到你可以发现事情首先被弄乱的地方.根据所涉及协议的复杂程度,几乎不可能真的很容易......
是否有项目符号的来源,或下面的游戏玩家的答案只是复制您的列表?
大.谢谢.关于wireshark的另一件事.它收集了如此多的数据,我怎么能过滤掉这样的东西呢?如果wireshark出现了什么我可能会在稍后发布它...
在我的情况下,我只是在本地运行app时调用api才得到此异常.在dev,qa或prod环境中没有问题.修复?在本地使用http而不是https.我们认为它可能与负载均衡器有关.但我们刚刚使用https转换更新了我们的dev,qa和prod web.configs.问题解决了.

2> willmaz..:

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

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 

另一种解决方案:
在本地计算机或服务器中启用强加密以使用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 

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



3> cagatay..:

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

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


这该怎么做 ?
+1.在我的C#程序中,我正在敲打着为什么`EndReceive`在有优雅的客户端终止时抛出异常的原因.不知道这是设计的.我觉得在普通的代码流中抛出异常是不好的设计.感谢上帝的重载方法.
@MSaudi这正在使用异步调用,请确保您了解代码在处理返回的数据时不会停止。示例使用https://msdn.microsoft.com/zh-cn/library/bew39x2a(v=vs.110).aspx。基本上,您必须拥有一个带有State public类的StateObject类,其中public byte [] buffer = new byte [1024],public Socket socket;并调用一个名为Receive(Socket s)的函数,该函数执行StateObject so = new StateObject (); so.socket = s; s.BeginReceive(so.buffer,0,256,0,new AsyncCallback(ReceiveCallback),所以); 在`void ReceiveCallback(IAsyncResult ar)`中,您可以在上面调用该代码。
@cagatay虽然它提供了一种解决方案,但我从未见过异步方法的价值,在异步方法中,您需要立即知道在执行“发送”之后返回的内容,然后才能执行其他任何操作。
实际上,我发现此方法并非万无一失。它还可能导致OP的错误:http://stackoverflow.com/questions/17790612/socketexception-an-existing-connection-was-forcably-closed-by-the-remote-host?rq=1

4> ayheber..:

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

只需转到" .context.cs"文件(位于 "*.edmx"文件下的" .context.tt"下).

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

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

希望这是有帮助的.


这只能帮助那些使用Entity Framework的人遇到问题,而不是那些正在做一个简单的`socket.Send(x); byte [] buffer = new byte [1]; socket.Receive(buffer,0,1,0);`读取返回的字节,这是OP的问题.
@FirstStep:因为这是一个构造函数。

5> 0x49D1..:

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

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


这是为我解决问题的一种方法.它实际上与默认使用的TLS .NET版本有关.4.5.2和更低的使用TLS 1.0,而4.6和更高版本允许1.1和1.2更聪明.这也可以通过将服务器上的TLS要求降低到1.0来证明,这也解决了问题.
推荐阅读
农大军乐团_697
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有