[英]C# StreamWriter / NetworkStream / TcpClient / Not sending data after idle for +5 min
我從NetworkStream
設置StreamWriter
/ StreamReader
連接來控制一塊測試設備。 底層連接是TCP。
在此特定情況下,此連接保持空閑幾分鍾。 通過+5分鍾后,當我調用streamWriter.writeLine(...)
,然后刷新,沒有數據從我的計算機發送到測試設備(在wireshark上觀看數據包)。 在空閑時間之前和期間,不交換數據包。 沒有FIN,或RST數據包等......
調試我的streamWriter
對象,它似乎仍然有效( connected = true
等...)
我有問題確定我的StreamWriter
/ NetworkStream
/ TcpClient
對象的哪個部分超時或關閉w / out發送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,如果有幫助的話。
任何建議將不勝感激。 如果我需要進一步解釋任何細節或澄清某些內容,也請告訴我。
此問題已通過實施時間檢查來解決,如果超過幾分鍾沒有流量,則會關閉並重新建立連接。 這是因為在主機上運行的防病毒軟件是主動的,但沒有通知,終止空閑套接字連接。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.