将 TcpClient ReceiveTimeout 与同步程序一起使用

Posted

技术标签:

【中文标题】将 TcpClient ReceiveTimeout 与同步程序一起使用【英文标题】:using TcpClient ReceiveTimeout with synchronous program 【发布时间】:2014-12-15 18:36:49 【问题描述】:

我有一个多线程 C# 程序,其中每个线程使用 TcpClient 从多个服务器同步接收面向文本/行的数据。

它已经运行了 2 年没有错误,但是当提供服务器的供应商发生变化时,我们开始看到供应商服务器程序出现缓冲区溢出的问题,并且他们的修复(显然)阻止了核心转储,但也他们停止发送给我们。但是他们并没有断开 TCP 连接,所以双方都显示为 ESTABLISHED。

供应商告诉我们,另一位客户通过简单地实现超时并在可配置的超时后未收到任何数据时重新建立连接来解决此问题。

由于我使用同步模型(本质上是“while readline()”)实现了我的线程,我可以使用 TcpClient ReceiveTimeout 属性并期望它正常工作吗?我尝试了一个更简单的非线程版本,它似乎可以在第一个循环中工作,但之后就不行了。

我真的不想重写程序来使用异步套接字模型。

任何关于使用同步 TcpClient 超时的简单方法的建议将不胜感激。

米奇

附录:当我在 ReadLine() 上收到异常时,我确实关闭了 TcpClient 并重新开始,就像我收到网络断开一样。 “不工作”是指它在几次后停止超时,即使 1.) 我仍然没有收到任何东西,并且 2.) 我被困在 ReadLine() 中。

【问题讨论】:

请详细说明“它似乎在第一个循环中起作用,但之后却没有”。请注意,一旦套接字出现故障(包括超时),您必须关闭它并重新开始。 【参考方案1】:

ReceiveTimeout 适用于同步 IO。 There is no timeout for async socket reads. 如果ReceiveTimeout 对您不起作用,则问题中给出的信息中存在一些不明显的错误。在这种情况下发布复制代码。

【讨论】:

好的,我明天重新测试...如果仍然无法正常工作,我会回来... 仅供参考,看起来它现在正在工作......不知道为什么我认为它以前没有(?)。感谢您的帮助。

以上是关于将 TcpClient ReceiveTimeout 与同步程序一起使用的主要内容,如果未能解决你的问题,请参考以下文章

TcpClient 不会接收所有数据

如何处理 TCPClient 中接收到的数据? (德尔福 - 印地)

C# - 执行 SslStream.Read 后如何知道 TcpClient 中剩余多少字节

TCPClient组件和TCPServer组件的主要方法和属性

C# TcpClient 不会注册断开连接

关闭 TcpListener 和 TcpClient 连接的正确顺序(哪一侧应该是主动关闭)