代码之家  ›  专栏  ›  技术社区  ›  Jim Mischel

是什么导致了.NET远程处理中的“TCP通道协议冲突,需要前导码”?

  •  8
  • Jim Mischel  · 技术社区  · 14 年前

    我有一个分布式应用程序,在内部千兆网络上使用.NET远程处理。有一台服务器和十几个客户机连接到服务器。客户机运行多个线程,每个客户机最多可以有10个并发请求。

    这个应用程序大部分时间都工作得很好。服务器一次可以运行几个月。有时我会在客户机上得到一个异常,但我不知道是什么导致了这个异常。异常和堆栈跟踪是:

    System.Runtime.Remoting.RemotingException: Tcp channel protocol violation: expecting preamble.
    
    Server stack trace: 
       at System.Runtime.Remoting.Channels.Tcp.TcpSocketHandler.ReadAndMatchPreamble()
       at System.Runtime.Remoting.Channels.Tcp.TcpSocketHandler.ReadVersionAndOperation(UInt16& operation)
       at System.Runtime.Remoting.Channels.Tcp.TcpClientSocketHandler.ReadHeaders()
       at System.Runtime.Remoting.Channels.Tcp.TcpClientTransportSink.ProcessMessage(IMessage msg, ITransportHeaders requestHeaders, Stream requestStream, ITransportHeaders& responseHeaders, Stream& responseStream)
       at System.Runtime.Remoting.Channels.BinaryClientFormatterSink.SyncProcessMessage(IMessage msg)
    
    Exception rethrown at [0]: 
       at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
       at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
    

    这是我调用远程处理的堆栈跟踪。

    在我正在进行的调用中,或者在服务器返回的数据中,我已经查找并没有发现任何异常。

    谷歌搜索这个错误并不是很有效。我看到的大多数错误都是围绕着某个人从HTTP转换为TCP而发生的,并且没有改变任何东西,所以当他们尝试连接时会得到异常。在我的情况下,客户端将运行 在我得到这个错误之前。

    另一个数据点:服务器确实收到很多请求。大多数客户机都是网络爬虫,每分钟向服务器发出2000多个请求。因此,服务器每秒处理500个以上的请求,流量激增。在任何情况下,服务器似乎可以处理流量,如果服务器过载,我期望会有一个完全不同的错误。

    知道是什么导致了这个错误吗?

    2 回复  |  直到 10 年前
        1
  •  2
  •   ertan    14 年前

    当收到的消息头错误时,通常会发生此错误。您可以在创建到服务器的telnet连接时重复此错误,然后键入一些内容。在大多数情况下,这是一个网络错误。

    我强烈推荐检查你的防火墙。某些防火墙由于错误的攻击警报而丢弃网络数据包。

    负载平衡是另一个可能的原因。负载均衡器将数据包拆分到不同的服务器。

        2
  •  0
  •   Oleg Neumyvakin    10 年前

    当MS DNS服务器使用太多开放端口时,我会看到这个问题,因此无法创建出站端口。是的,很有趣。