其他分享
首页 > 其他分享> > lwip+freeRTOS 故障容错 客户端主动发起连接

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