事前准備
下載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