esp8266 作为 tcp server,客户端连接后再断开,这样反反复复多次,第6次就再也连不上了

  • 按照esp8266官方提供的tcp server示例代码ESP8266 as TCP server,在ESP8266 RTOS SDK 1.5版本上测试,发现同一个客户端,连续连接断开,再连接再断开,这样反反复复5次,在第6次的时候,就再也连不上了,显示服务器拒绝连接。

  • 使用的客户端是电脑端的tcp test tools,直接连接192.168.4.1监听的端口。

后来分析了SDK底层的espconn.c、espconn_tcp.c和tcp.c代码,才发现问题所在,原来是调用espconn_accept之前没有调用espconn_init导致的,官方示例代码里面根本没有调用espconn_init,如果不调用,就没办法创建EspMbox消息队列,所以后面就没办法使用os_post给其发送消息,所以即使客户端断开连接了,server仍然无法释放资源!!!

void ICACHE_FLASH_ATTR espconn_init(void)
{
    if (sys_mbox_new(&EspMbox, ESPCONN_MBOX_SIZE) != ERR_OK) {
        LWIP_ASSERT("failed to create espconn_thread mbox", 0);
    }

#if ESPCONN_LOCKING

    if (sys_mutex_new(&lock_espconn_task) != ERR_OK) {
        LWIP_ASSERT("failed to create lock_espconn_task", 0);
    }

#endif /* ESPCONN_LOCKING */

    sys_mutex_new(&EspMsgMutex);

    if (EspMsgMutex == NULL) {
        printf("EspMsgMutex create fail\n");
    } else {
        printf("EspMsgMutex created\n");
    }

    sys_thread_new(ESPCONN_THREAD_NAME, espconn_thread, NULL, ESPCONN_THREAD_STACKSIZE, ESPCONN_THREAD_PRIO);
}
#

结论:

其实不调用espconn_init的话,tcp server也能工作,不是说不能监听端口、收发数据,只是client连续多次断开连接就会出现上述问题,但是网上很多小白,谁闲着没事干,连接断开再连接再断开呢?都是客户端连接一次能连上,后面就再也不管了,能用就行,不能用了再重启一下esp8266就完事了。

你可能感兴趣的:(嵌入式软件)