lwip堆栈netconn api保持连接”;“保持活力”;
我目前正在使用lwip堆栈实现modbus服务器,但“保持活动”功能不起作用。有人能帮我解决问题吗 代码: 我更改了以下设置: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
#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);
}