我从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,如果有帮助的话。
任何建议都将不胜感激。如果我需要进一步解释任何细节或澄清某些细节,请告诉我。
答案 0 :(得分:0)
此问题已通过实施时间检查来解决,如果超过几分钟没有流量,则会关闭并重新建立连接。这是因为主机上运行的防病毒软件是主动的,但没有通知,终止了空闲的套接字连接。