c# Socket心跳試驗,自定義發送包 和 使用KeepAlive


事前准備

下載Wireshark並安裝

打開Wireshark,修改過濾規則:ip.src eq 192.168.3.201 or ip.dst eq 192.168.3.201  如圖:

不使用KeepAlive

網上有段代碼,可以對socket進行心跳檢測,下面貼出部分代碼:

            bool blockingState = socket.Blocking;
            try
            {
                byte[] tmp = new byte[1];
                socket.Blocking = false;
                socket.Send(tmp, 0, 0);
                return true;
            }

Socket.Send方法的第二個參數表示發送數據的大小。如果此時設置為0,即使網絡正常的情況下也不會發送數據,拔不拔網線無所謂了。

我在心跳的地方記了日志,一直在寫,但是WireShark監測不到有消息發送,主要是因為發送數據的大小是0。圖:

但當我把第二個參數改成tmp.Length的時候(也就是1),就可以發送數據了。圖:

我設置的是每隔7秒發送一次數據。

如果拔掉網線,當下次心跳檢測的時候,就會報錯。圖:

最后一條紅色的數據之后,就沒有再見到有數據發送了。雖然這種方法可以檢測Socket是否斷開,但是不是很好,響應不及時。

使用KeepAlive

正常情況

WireShark會檢測到不停的往Socket服務器發送消息,也就是心跳檢測,圖:

 

三次握手建立連接之后(前三條),每隔3秒心跳檢測一次,跟我在代碼里面設置的一致。

在拔掉網線的情況下

WireShark監控到每隔1秒發送一次消息,檢測10次后發送[RST]命令斷開連接。注意看Time列,從16開始執行10次。這是win10系統默認設置。圖:

參考網址:https://blog.csdn.net/elie_yang/article/details/95197181


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM