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

pet*_*ter 130 .net c# sockets networking

我正在使用一个商业应用程序,它正在抛出带有消息的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
Run Code Online (Sandbox Code Playgroud)

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

发生两种可能性之一,我不确定,

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

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

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

Rar*_*arr 86

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

  • 您正在向应用程序发送格式错误的数据
  • 客户端和服务器之间的网络链接由于某种原因而下降
  • 您已在第三方应用程序中触发了导致其崩溃的错误
  • 第三方应用程序已耗尽系统资源

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

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

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

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

wil*_*maz 61

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

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 
Run Code Online (Sandbox Code Playgroud)

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

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

  • 您可以将多个值添加在一起以支持多种协议。因此,要支持从 SSL3 到 TLS1.2 的所有内容,请设置 SecurityProtocol = (SecurityProtocolType)4080。 (2认同)

cag*_*tay 28

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

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

  • 这该怎么做 ? (4认同)
  • +1.在我的C#程序中,我正在敲打着为什么`EndReceive`在有优雅的客户端终止时抛出异常的原因.不知道这是设计的.我觉得在普通的代码流中抛出异常是不好的设计.感谢上帝的重载方法. (4认同)
  • @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)`中,您可以在上面调用该代码。 (2认同)
  • @cagatay虽然它提供了一种解决方案,但我从未见过异步方法的价值,在异步方法中,您需要立即知道在执行“发送”之后返回的内容,然后才能执行其他任何操作。 (2认同)
  • 实际上,我发现此方法并非万无一失。它还可能导致OP的错误:http://stackoverflow.com/questions/17790612/socketexception-an-existing-connection-was-forcably-closed-by-the-remote-host?rq=1 (2认同)

ayh*_*ber 10

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

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

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

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

希望这是有帮助的.

  • 这只能帮助那些使用Entity Framework的人遇到问题,而不是那些正在做一个简单的`socket.Send(x); byte [] buffer = new byte [1]; socket.Receive(buffer,0,1,0);`读取返回的字节,这是OP的问题. (3认同)
  • 这是开玩笑的回答吗?[Entity Framework 6 代理](https://learn.microsoft.com/en-us/ef/ef6/fundamentals/proxies) 与这个问题所涉及的网络/套接字完全无关。 (3认同)
  • @FirstStep:因为这是一个构造函数。 (2认同)

0x4*_*9D1 9

有同样的错误.实际上工作的情况是使用一些代理(在我的情况下是小提琴手)发送流量.更新了从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来证明,这也解决了问题. (5认同)

Baz*_*lay 5

由于 entity.In 实体中的循环引用,我遇到了这个异常

public class Catalog
{
    public int Id { get; set; }
    public int ParentId { get; set; }
    public Catalog Parent { get; set; }
    public ICollection<Catalog> ChildCatalogs { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

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