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

本文分析了ESP8266作为TCP服务器时遇到的一个问题:客户端连续连接断开5次后,第六次无法连接。通过深入研究SDK底层代码,发现未调用espconn_init初始化函数导致资源无法释放。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 按照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就完事了。

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值