【发布时间】:2016-06-02 20:58:32
【问题描述】:
我从NetworkStream 建立了一个StreamWriter/StreamReader 连接来控制一台测试设备。底层连接是 TCP。
在此特定情况下,此连接会保持空闲几分钟。 +5 分钟后,当我调用streamWriter.writeLine(...),然后刷新时,没有数据从我的计算机发送到测试设备(在wireshark 上观看数据包)。在空闲时间之前和期间,不交换数据包。没有 FIN 或 RST 数据包等...
调试我的streamWriter 对象,它似乎仍然有效(connected = true 等...)
我在识别我的StreamWriter/NetworkStream/TcpClient 对象的哪个部分超时或关闭时遇到问题,而没有发送 FIN 或 RST 消息以正式关闭连接。
这是失败代码的缩写版本:
private void button1_Click(object sender, EventArgs e)
{
TcpClient client;
NetworkStream networkStream;
System.IO.StreamReader streamReader;
System.IO.StreamWriter streamWriter;
string outputString;
client = new TcpClient("555.555.555.555", 5025);
client.ReceiveTimeout = 5000;
networkStream = client.GetStream();
streamReader = new System.IO.StreamReader(networkStream);
streamWriter = new System.IO.StreamWriter(networkStream);
//This section works fine, every time
streamWriter.WriteLine("*IDN?\n"); //Ask for equipment identification
streamWriter.Flush();
outputString = streamReader.ReadLine();
Console.WriteLine("First Attempt: Connected to: {0}", outputString);
System.Threading.Thread.Sleep(301000); //Simulate idle connection time
//The read in this section fails if the sleep above is longer than 5 minutes
streamWriter.WriteLine("*IDN?\n"); //Ask for equipment identification
streamWriter.Flush();
outputString = streamReader.ReadLine();
Console.WriteLine("Second Attempt: Connected to: {0}", outputString);
}
当我尝试从我写给设备的内容中读取响应时发现错误。因为设备从来没有看到我的请求,所以我收到了读取超时错误。
如果我将睡眠时间更改为少于 5 分钟,一切正常。
我已经研究过在套接字上实现某种保持活动状态,但我的理解是,在本地,TCP 连接将保持打开状态,直到任一端关闭它。
我也不认为这是第 3 方网络问题,因为 Wireshark 显示没有发送/接收 FIN 或 RST 消息,并且 Wireshark 没有看到我在 5 分钟后写出消息的尝试,这也是在我的电脑上运行。
如果有帮助,我正在我的 Windows 7 计算机上运行 Microsoft Visual Studio 2010。
任何建议将不胜感激。如果我需要进一步解释任何细节或澄清某些事情,也请告诉我。
【问题讨论】:
-
我也遇到了同样的问题。你的代码没有问题。设备之间的某些东西正在清理空闲连接(可能是有状态的防火墙?)。添加keepalive(在我的情况下10分钟就足够了)是我能找到的唯一解决方案。
-
值得一试以防万一 - 在 tcp 客户端上设置
NoDelay -
通过一些额外的挖掘,我禁用了我的防病毒软件“赛门铁克”,并且无法再重现该问题。我的计算机上由 IT 部门设置的策略似乎将关闭空闲连接。为了更好地使用该策略,我将实施一个简单的计时检查,如果上次使用连接是在某个时间之前,我将关闭并重新打开连接。
-
也就是说,我在 Google 上进行了一些快速搜索,但找不到任何关于空闲时间线和套接字连接使用的指南……知道吗?
标签: c# tcpclient streamwriter networkstream