我在寫一個小型(C#)客戶端應用程序,它使用TCP/IP連接將數據發送到遠程服務器。我使用的是標準的.Net TcpClient對象,並且希望將連接從客戶端打開,因爲我定期向服務器提交數據包。但是,服務器可能會關閉連接,在這種情況下,我需要知道在發送下一個數據包之前重新連接。.Net Socket不響應遠程斷開連接?
使用Wireshark的,我可以看到(只)以下的對話時,服務器將終止連接:
server >>> FIN, ACK
ACK <<< client
我做什麼不看到的是我的客戶擁有自己的FIN響應,完成連接關機。結果是我的客戶端程序只發現連接在發送下一個數據包後關閉。
有什麼辦法,我可以建立的TcpClient或其基礎插槽,以完成斷開連接,並提供一些反饋,使我的客戶端代碼知道發送下一個數據包之前重新連接?
添加響應於評論如下: 我的發送代碼很簡單 - 保持所述TcpClient的和的NetworkStream構件變量的對象,具有包含(基本上)以下的成員函數:
bool sent = false;
byte[] buffer = Encoding.UTF8.GetBytes(dataString);
while (!sent)
{
try
{
m_outStream.Write(buffer, 0, buffer.Length);
sent = true;
}
catch (Exception ex)
{
if (m_outStream != null) { m_outStream.Dispose(); }
m_client = new TcpClient(AddressFamily.InterNetwork);
m_client.Connect(ipAddress, ipPort);
m_outStream = m_client.GetStream();
}
}
通過初始化m_client和m_outStream,每次只執行一次傳遞。然後使用Wireshark,我可以看到服務器發送一個標記爲FIN, ACK
的數據包,客戶端用ACK
響應。
下次我打電話給我的功能時,數據用PSH, ACK
發出,而服務器用RST, ACK
作出響應,但不讀取傳入數據。客戶沒有例外。
然後,我打電話給我的函數的第二時間,併產生一個異常導致連接被重新啓動。
感謝這個評論,但該文件指出,連只是作爲最後的讀/寫的事實。我擔心的是TcpClient正在將連接置於半棄狀態。 – Nick 2012-03-13 11:38:51
我已經更新了我的答案,讓你知道如何去做這件事。但總的來說,框架處理Tcp連接的方式是,假設當它們不是時,它是開放和優雅地處理的。您還負責清理我的最後一段中解釋的'TcpClient'和'Stream'。 – ntziolis 2012-03-13 11:57:48
非常感謝您的更新 - 我猜'stream.Read'調用與我發現的Socket調用基本相同,但是處於更高級別的抽象。 – Nick 2012-03-13 12:03:55