在使用 W5200W5500 的TCP通信過程中,有一個非常容易被問到的問題:

(這裡以W5200為例)

W5200 作為服務器,假如客戶端的網線斷開 或 瞬間停電,服務器該怎樣判斷?

那麼當客戶端由於這些原因忽然斷開,該怎樣解決?

今天給大家介紹解決以上問題的辦法,即如何使用Keepalive。

什麼是 Keepalive?

Keepalive 即心跳檢測,以下簡稱 KA,之所以稱之為心跳檢測是因為它像心跳一樣每隔一段時間發一次,以此來告訴對方自己是否存活。心跳檢測用於TCP通訊過程中服務器檢測客戶端是處於長時間空閑(在線)還是已經斷開,一般采用客戶端定時發送簡單的通訊包,一般是很小的包或者空包給服務器(W5200 的心跳包為1字節),如果在指定時間內沒有收到該心跳包,則服務器會判斷客戶端已經斷開,此時程序中的 Socket 狀態機會轉到 SOCKET_CLOSED 並重新打開 Socket去連接服務器/監聽客戶端。

KeepAlive 怎麼分類?

KA 根據發出方不同可以分為兩種,一種是由客戶端發給服務器的心跳包,一種是服務器發給客戶端的心跳包,選擇哪一種方式需要看哪一方實現起來方便合理。需要注意的是,W5200 根據合理的設計,其心跳包需要在 Socket TCP 連接建立之後,服務器和客戶端至少進行一次數據交互,且在設定的時間內沒有數據交互時發出。

W5200 KA程序說明

下面我以 W5200 的TCP Server官方例程為例,用PC建立TCP客戶端來連接W5200,說明KA的實現方法。

定義和初始化部分:

程序中用到了定時器和中斷函數,在w5200_config.c中做了定義:

image
image

在主程序中進行初始化:

image

程序中定義了ka_tick_flag(KA定時器開始計時標志位)、ka_send_flag(KA發送標志位)、ka_no_data_tick(KA無數據傳輸時間計時器)以及ka_send_tick(KA發送定時器)。在w5200_config.c中對以上定義進行了初始化:

image

主循環部分:

當程序燒錄後,按Reset鍵重啟W5200後服務器打開一個 Socket,此時 Socket 由 SOCK_CLOSED 變為 SOCK_INIT 並處於監聽狀態。PC建立客戶端成功連接W5200 後,Socket 處於 SOCK_ESTABLISHED,下面是程序具體的操作過程:

image
image

例程下載:http://pan.baidu.com/s/1eQ3vkZo