【问题标题】:C# StreamWriter / NetworkStream / TcpClient / Not sending data after idle for +5 minC# StreamWriter / NetworkStream / TcpClient / 空闲 +5 分钟后不发送数据
【发布时间】: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


【解决方案1】:

通过实施时间检查来解决此问题,如果超过几分钟没有流量,该时间检查将关闭并重新建立连接。这是因为在主机上运行的杀毒软件是主动的,但没有通知,终止空闲的套接字连接。

【讨论】:

    猜你喜欢
    • 2012-04-15
    • 2017-08-13
    • 1970-01-01
    • 1970-01-01
    • 2019-02-27
    • 2017-08-19
    • 1970-01-01
    • 2010-11-27
    • 2013-06-28
    相关资源
    最近更新 更多