【发布时间】:2014-12-15 18:36:49
【问题描述】:
我有一个多线程 C# 程序,其中每个线程使用 TcpClient 从多个服务器同步接收面向文本/行的数据。
它已经运行了 2 年没有错误,但是当提供服务器的供应商发生变化时,我们开始看到供应商服务器程序出现缓冲区溢出的问题,并且他们的修复(显然)阻止了核心转储,但也他们停止发送给我们。但是他们并没有断开 TCP 连接,所以双方都显示为 ESTABLISHED。
供应商告诉我们,另一位客户通过简单地实现超时并在可配置的超时后未收到任何数据时重新建立连接来解决此问题。
由于我使用同步模型(本质上是“while readline()”)实现了我的线程,我可以使用 TcpClient ReceiveTimeout 属性并期望它正常工作吗?我尝试了一个更简单的非线程版本,它似乎可以在第一个循环中工作,但之后就不行了。
我真的不想重写程序来使用异步套接字模型。
任何关于使用同步 TcpClient 超时的简单方法的建议将不胜感激。
米奇
附录:当我在 ReadLine() 上收到异常时,我确实关闭了 TcpClient 并重新开始,就像我收到网络断开一样。 “不工作”是指它在几次后停止超时,即使 1.) 我仍然没有收到任何东西,并且 2.) 我被困在 ReadLine() 中。
【问题讨论】:
-
请详细说明“它似乎在第一个循环中起作用,但之后却没有”。请注意,一旦套接字出现故障(包括超时),您必须关闭它并重新开始。
标签: c# tcp client-server