LwIP TCP 客戶端 保活功能

LwIP TCP 客戶端 保活功能

之前在做項目的時候,有這麼一種情況是TCP客戶端是沒有響應的。首先正常連接服務器,然後斷開網線,TCP 客戶端沒有任何響應,可是再插上網線就永遠也連接不到服務器了。

這個現象想必大家經常遇到,不知道你們是怎麼處理的。LwIP畢竟是一個用了這麼久的協議棧,必定有處理方式,那就是保活功能,這個功能在服務器模式下,是自動開啓的,我們不需要注意。

首先需要在lwipopts.h文件中添加如下宏定義,目的是打開保活功能,這些數值根據需求自己更改。

#define LWIP_TCP_KEEPALIVE        1
#define TCP_KEEPIDLE_DEFAULT      5000UL
#define TCP_KEEPINTVL_DEFAULT     1000UL
#define TCP_KEEPCNT_DEFAULT       5UL
#define TCP_MAXIDLE               TCP_KEEPCNT_DEFAULT * TCP_KEEPINTVL_DEFAULT

第一條爲打開保活功能,第二條爲服務器和客戶端5秒內沒有數據傳輸,就開始探測,第三條爲每1秒探測一次,第四條爲探測5次,最後一條爲服務器和客戶端沒有數據傳輸最大時間。實際上後邊的4條可以不添加,使用默認配置,就是時間有點長爲2小時。

其次新建客戶端代碼如下,配置連接打開保活功能。

struct netconn *TcpClientConn;
TcpClientConn = netconn_new(NETCONN_TCP);
#if LWIP_TCP_KEEPALIVE
TcpClientConn->pcb.tcp->so_options |= SOF_KEEPALIVE;
#endif /* End LWIP_TCP_KEEPALIVE */
err_t err = netconn_connect(TcpClientConn,&ServerIP,ServerPort);
struct netbuf *ClientDataBuf;
err = netconn_recv(TcpClientConn,&ClientDataBuf);
if(err == ERR_OK)
{
    //這裏添加處理接收到的數據部分
}
else
{
    //斷線就會進入這裏
    netconn_disconnect(TcpClientConn);
    netconn_delete(TcpClientConn);
}
netbuf_delete(ClientDataBuf);

以上爲客戶端接收部分,當然在該文件前需要引入以下兩個頭文件,不然會報錯的。

#include "lwip/tcp.h"
#include "lwip/ip.h"

這樣就OK了,以上代碼只是簡單示例,需要修改邏輯才能適合你的應用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章