lwip+freeRTOS 故障容错 客户端主动发起连接
作者:互联网
1、简单的需求
STM32终端为tcp客户端,主动向TCP服务器发起连接,然后进行通信。
流程:STM32网卡初始化-----lwIP初始化--------DHCP-------------creat socket Client-------send-------recv
2、实际情况
(1)如何处理拔掉网线的情况
(2)如何处理TCP服务器没开的情况,即判断socket状态
3、解决办法
新建两个变量is_netif_ok,is_server_closed用于表示实际的两种情况。
如果网线拔掉,关闭当前socket;如果服务器关闭,关闭当前socket;如果网线再插上,重新创建socket client进行连接。
3.1 处理把掉网线
首先配置lwIP支持网线热插拔检测功能,这里讲清楚了 https://blog.csdn.net/u010058695/article/details/116200135?spm=1001.2014.3001.5501
当网线状态变化时,给全局变量is_netif_ok赋值即可
3.2 处理服务器连接状态
recv函数配置成阻塞状态时,可以通过其返回值来判断当前socket连接状态,也就是判断服务器的状态。返回值小于等于零即socket出现问题,给is_server_closed赋值即可。
3.3 主动连接的实现代码
/* Infinite loop */
for(;;)
{
if (is_netif_ok){
if (!is_server_closed){
/*! client not created */
if (-1 == client_id){
int creat_res = creat_tcp_client(&client_id,SOCKET_SERVER_ADDR,SOCKET_SERVER_PORT);
if (creat_res != 0) {
DEBUG("creat_tcp_client error: res = %d\r\n", creat_res);
} else {
DEBUG("creat_tcp_client success\r\n");
}
}
} else {
/*! server is closed */
if (-1 != client_id){
close_tcp_client(client_id);
client_id = -1;
}
is_server_closed = 0;/*! assume server is running */
}
} else if (-1 != client_id){
close_tcp_client(client_id);
client_id = -1;
}
osDelay(1);
}
标签:lwip,socket,freeRTOS,tcp,server,容错,client,creat,id 来源: https://blog.csdn.net/u010058695/article/details/116208540