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了,以上代码只是简单示例,需要修改逻辑才能适合你的应用。

发布了7 篇原创文章 · 获赞 9 · 访问量 2267

猜你喜欢

转载自blog.csdn.net/wait_for_STM32/article/details/103186424