C#StreamWriter / NetworkStream / TcpClient /闲置后不发送数据+5分钟

时间:2016-06-02 20:58:33

标签: c# tcpclient streamwriter networkstream

我从StreamWriter设置StreamReader / NetworkStream连接以控制一块测试设备。底层连接是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连接将保持打开状态,直到任何一端关闭它。

我也不相信这是第三方网络问题,因为Wireshark显示没有发送/接收FIN或RST消息,并且我在5分钟后尝试写出消息的Wireshark没有看到也在我的电脑上运行。

我在Windows 7计算机上运行Microsoft Visual Studio 2010,如果有帮助的话。

任何建议都将不胜感激。如果我需要进一步解释任何细节或澄清某些细节,请告诉我。

1 个答案:

答案 0 :(得分:0)

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