我正在做一些測試,試圖隔離庫(.NET)中的一些奇怪行爲。當我通過C++使用Winsock API並簡單地調用closesocket()時,我發現窗口端發送FIN/ACK數據包,遠端發送一個ACK數據包。這就是我所稱的優雅結尾。但是,當用C#編程時,我沒有看到我會稱之爲優雅的關閉。在C#中,我打開我的套接字,然後在關閉它時,我看到windows首先調用Socket.Shutdown()時發送一個FIN數據包只有。但是,無論如何,當我在C#中調用Socket.Close()時,都會發送一個RST數據包,並且連接立即被丟棄。這讓我感到困惑,因爲從我在線閱讀的內容來看,TCP關閉過程應該是FIN/ACK - > ACK(實際上雙方都是,但現在我只關心「我的」方面);即根本不應該有混合中的RST分組。從我讀過的內容來看,顯然,只有當接收者對連接狀態不確定並且想要出去時纔會發送RST數據包。如何防止.NET庫關閉發送RST數據包
爲什麼這個RST數據包是在.NET中按計劃關機發送的,而根本沒有在從winsock API計劃關機時發送?有沒有辦法阻止從.NET正常關機期間傳輸RST數據包?
如果重要,在兩個代碼路徑中,我在調用相應的close()方法之前先讀取套接字上的所有可用數據。
這很有趣。我必須看到當我實施睡眠時會發生什麼。我不知道還會出現什麼,因爲我不認爲這是可行的(如果它的作品)在這種情況發生的全部背景。我製作了框架程序來隔離行爲。不過謝謝你,因爲我沒有想過在這裏使用睡眠電話。 –