lwip堆栈netconn api保持连接”;“保持活力”;

lwip堆栈netconn api保持连接”;“保持活力”;,c,lwip,C,Lwip,我目前正在使用lwip堆栈实现modbus服务器,但“保持活动”功能不起作用。有人能帮我解决问题吗 代码: 我更改了以下设置: #ifndef LWIP_TCP_KEEPALIVE #define LWIP_TCP_KEEPALIVE 1 #endif #ifndef TCP_KEEPIDLE_DEFAULT #define TCP_KEEPIDLE_DEFAULT 7200000UL /* Default KEEPALIVE timer in mil

我目前正在使用lwip堆栈实现modbus服务器,但“保持活动”功能不起作用。有人能帮我解决问题吗

代码:

我更改了以下设置:

#ifndef LWIP_TCP_KEEPALIVE
#define LWIP_TCP_KEEPALIVE              1
#endif



#ifndef  TCP_KEEPIDLE_DEFAULT
#define  TCP_KEEPIDLE_DEFAULT     7200000UL /* Default KEEPALIVE timer in milliseconds */
#endif

#ifndef  TCP_KEEPINTVL_DEFAULT
#define  TCP_KEEPINTVL_DEFAULT    75000UL   /* Default Time between KEEPALIVE probes in milliseconds */
#endif

#ifndef  TCP_KEEPCNT_DEFAULT
#define  TCP_KEEPCNT_DEFAULT      9U        /* Default Counter for KEEPALIVE probes */
#endif
在我的代码中还有其他我必须做的事情吗?如果我尝试这样做,服务器将在传输HTML页面后结束连接。我试图删除netconn_close(pxNetCon);和/或netconn_delete(pxNetCon),但这并不能给出正确的解决方案。连接将保持打开状态,但我无法再次连接


那么还有其他我没有使用的设置吗?还是需要对代码进行修改

LWIP\u TCP\u KEEPALIVE控件编译以支持TCP keepalives,默认情况下,每个连接都关闭了keepalives

上面的应用程序正在使用netconn API来管理其连接,并且没有netconn API来启用SO_KEEPALIVE选项。为此,您需要使用LwIP的类似BSD的套接字API和setsockopt()调用:

int optval=1;

setsockopt(s,SOL_SOCKET,SO_KEEPALIVE,&optval,sizeof(optval))

LWIP\u TCP\u KEEPALIVE控件编译以支持TCP keepalives,默认情况下,每个连接都关闭了keepalives

上面的应用程序正在使用netconn API来管理其连接,并且没有netconn API来启用SO_KEEPALIVE选项。为此,您需要使用LwIP的类似BSD的套接字API和setsockopt()调用:

int optval=1;

setsockopt(s,SOL_SOCKET,SO_KEEPALIVE,&optval,sizeof(optval))

如何启用原始API时保持活动状态

  • 在lwipopts.h
  • 调用tcp_connect(pcb…)时
  • 在循环()中
    此设置使服务器拔出后超时10秒

    如何启用原始API时保持活动状态

  • 在lwipopts.h
  • 调用tcp_connect(pcb…)时
  • 在循环()中
    此设置使服务器拔下插头后超时10秒

    您的意思是保持活动吗?嗨,不,我是指TCP协议的保持活动功能。这个例子是一个http协议,但我正在尝试实现一个具有保持活动功能的modbus服务器。通过保持活动,你的意思是吗?嗨,不,我是指TCP协议的保持活动功能。这个例子是一个http协议,但我正在尝试实现一个具有keep alive功能的modbus服务器。您好,谢谢您的回复!这解释了很多!在这种情况下,我将使用类似BSD的套接字API!非常感谢你!嗨,我在想这个问题,我有一个问题。BSD套接字API构建在Netconn API之上,因此BSD套接字如何可能具有此功能而Netconn API不具有此功能。使用原始api来实现这一点?套接字api执行的一些操作直接在PCB(协议控制块)上操作,该PCB的级别低于netconn。如果你看一下2080行,我们可以看到SO_KEEPALIVE最终调用ip_set_option()来启用keep alive选项嗨,谢谢你的回复!这解释了很多!在这种情况下,我将使用类似BSD的套接字API!非常感谢你!嗨,我在想这个问题,我有一个问题。BSD套接字API构建在Netconn API之上,因此BSD套接字如何可能具有此功能而Netconn API不具有此功能。使用原始api来实现这一点?套接字api执行的一些操作直接在PCB(协议控制块)上操作,该PCB的级别低于netconn。如果你看一下2080行,我们可以看到SO_KEEPALIVE最终调用ip_set_option()来启用keep-alive选项
    #ifndef LWIP_TCP_KEEPALIVE
    #define LWIP_TCP_KEEPALIVE              1
    #endif
    
    
    
    #ifndef  TCP_KEEPIDLE_DEFAULT
    #define  TCP_KEEPIDLE_DEFAULT     7200000UL /* Default KEEPALIVE timer in milliseconds */
    #endif
    
    #ifndef  TCP_KEEPINTVL_DEFAULT
    #define  TCP_KEEPINTVL_DEFAULT    75000UL   /* Default Time between KEEPALIVE probes in milliseconds */
    #endif
    
    #ifndef  TCP_KEEPCNT_DEFAULT
    #define  TCP_KEEPCNT_DEFAULT      9U        /* Default Counter for KEEPALIVE probes */
    #endif
    
    #define LWIP_TCP_KEEPALIVE  1 // enable "kepp-alive"
    #define TCP_KEEPIDLE_DEFAULT    1000 // keep_idle : dont' send keep-alive until keep_idle after connecting
    #define TCP_KEEPCNT_DEFAULT     9U // keep_cnt : increase when no response after sending keep-alive every keep_intvl
    
    pcb->keep_intvl = 1000; // send "keep-alive" every 1000ms
    
    if(pcb_client->keep_cnt==pcb_client->keep_cnt_sent)
    {
        tcp_client_connection_close(pcb_client, client_s);
    }