【问题标题】:Remoting server forcibly closing client connections in the middle of remote calls远程服务器在远程调用过程中强制关闭客户端连接
【发布时间】:2009-01-27 09:47:57
【问题描述】:

我有一个由服务器组成的系统,该服务器接受来自客户端的远程调用,TCP 作为底层传输层。它通常像一个魅力,但如果我增加没有。客户端,服务器随机启动以关闭调用中间的 TCP 连接。并非所有通话都以这种方式中断。

这真是出乎意料的行为......我在服务器端没有异常,只是客户端异常:

System.Net.Sockets.SocketException: An existing connection was forcibly closed by the remote host

Server stack trace: 
   ved System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags)
   ved System.Runtime.Remoting.Channels.SocketStream.Read(Byte[] buffer, Int32 offset, Int32 size)
   ved System.Runtime.Remoting.Channels.SocketHandler.ReadFromSocket(Byte[] buffer, Int32 offset, Int32 count)
   ved System.Runtime.Remoting.Channels.SocketHandler.Read(Byte[] buffer, Int32 offset, Int32 count)
   ved System.Runtime.Remoting.Channels.SocketHandler.ReadAndMatchFourBytes(Byte[] buffer)
   ved System.Runtime.Remoting.Channels.Tcp.TcpSocketHandler.ReadAndMatchPreamble()
   ved System.Runtime.Remoting.Channels.Tcp.TcpSocketHandler.ReadVersionAndOperation(UInt16& operation)
   ved System.Runtime.Remoting.Channels.Tcp.TcpClientSocketHandler.ReadHeaders()
   ved System.Runtime.Remoting.Channels.Tcp.TcpClientTransportSink.ProcessMessage(IMessage msg, ITransportHeaders requestHeaders, Stream requestStream, ITransportHeaders& responseHeaders, Stream& responseStream)
   ved System.Runtime.Remoting.Channels.BinaryClientFormatterSink.SyncProcessMessage(IMessage msg)

Exception rethrown at [0]: 
   ved System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
   ved System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
   ved EBH.GuG.AgentKit.Transports.RemotingAgentHostEndPoint.SyncInvoke(Agent a, Int32 port)

【问题讨论】:

    标签: c# .net remoting


    【解决方案1】:

    您是否在 Windows XP/2000/98 上运行?

    如果是这样,XP 具有 10 个出站套接字的内置节流机制(以阻止您将桌面计算机用作服务器以迫使您为 windows Server 付费)我的直觉是您可能会达到这个限制。

    补充:

    也许您可以使用回调重新构建调用,以便它们在执行工作时不会保持打开的套接字,这应该会提高您的并发吞吐量。

    【讨论】:

    • 否 - 在 Windows Server 2003 上运行。并且它已经建立的连接已关闭 - 我认为节流机制通过限制可以建立的连接数来工作。
    【解决方案2】:

    您对客户端和服务器之间的网络硬件了解多少?

    每次我遇到这种问题,总是被证明是由错误配置的防火墙、负载平衡器等引起的。

    如果您在客户端和服务器连接到同一个交换机的情况下设置了一个测试环境,您应该能够执行负载测试以确定您的代码是否在不涉及任何其他网络硬件的情况下失败...

    【讨论】: