乐鑫技术交流
直播中

汪潇潇

7年用户 845经验值
私信 关注
[问答]

ESP8266 TCP保持活动状态功能似乎不起作用,为什么?

我正在编写基于ESP8266_RTOS_SDK的 tcp 客户端示例。
我正在使用 socket(), connect(),close() ...函数直接而不是 espconn_xxxx() api。
当我为TCP客户端设置保持活动状态参数时:

   ...
   client_fd= socket();
   ...
   
   int keepAlive = 1; //enable keepalive
     int keepIdle = 10; //60s
    int keepInterval = 5; //5s
    int keepCount = 3; //retry times

   rslt = setsockopt(client_fd, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepAlive, sizeof(keepAlive));
   rslt = setsockopt(client_fd, IPPROTO_TCP, TCP_KEEPIDLE, (void*)&keepIdle, sizeof(keepIdle));
   rslt = setsockopt(client_fd, IPPROTO_TCP, TCP_KEEPINTVL, (void *)&keepInterval, sizeof(keepInterval));
   rslt = setsockopt(client_fd, IPPROTO_TCP, TCP_KEEPCNT, (void *)&keepCount, sizeof(keepCount));
   
   ...
   connect(client_fd);
   ...



似乎 setsockopt 函数不起作用。

当服务器关闭套接字时,ESP8266 似乎没有在正确的时间知道这一点。
换句话说,当服务器关闭套接字时,recv() 不会在 10 5*3 = 25 秒内返回 -1。recv() 总是在 2 分钟内返回 -1。


              

回帖(1)

手托初梦

2024-7-12 17:53:12
在这种情况下,可能有以下几个原因导致 ESP8266 TCP 保持活动状态功能不起作用:

1. **SDK版本问题**:确保你使用的 ESP8266_RTOS_SDK 是最新版本,因为旧版本可能存在一些已知的问题或不支持某些功能。

2. **函数使用错误**:在使用 `socket()`, `connect()`, `close()` 等函数时,请确保你正确地使用了它们。例如,在使用 `setsockopt()` 函数时,你需要确保传入正确的参数,如 `client_fd`(套接字描述符)和 `SO_KEEPALIVE`(保持活动状态选项)。

3. **参数设置问题**:检查你设置的参数是否正确。例如,`keepIdle`, `keepInterval`, `keepCount` 等参数的值是否符合预期。如果参数设置不正确,可能导致保持活动状态功能无法正常工作。

4. **网络环境问题**:网络环境可能影响 TCP 保持活动状态功能。例如,网络延迟、丢包等问题可能导致保持活动状态功能无法正常工作。

5. **ESP8266硬件问题**:ESP8266硬件本身可能存在问题,导致 TCP 保持活动状态功能无法正常工作。你可以尝试使用其他 ESP8266 模块或设备进行测试,以排除硬件问题。

为了解决这个问题,你可以尝试以下步骤:

1. 确保使用最新版本的 ESP8266_RTOS_SDK。

2. 检查代码中 `setsockopt()` 函数的使用是否正确。例如:

   ```c
   int rslt = setsockopt(client_fd, SOL_SOCKET, SO_KEEPALIVE, &keepAlive, sizeof(keepAlive));
   ```

3. 检查 `keepIdle`, `keepInterval`, `keepCount` 等参数的设置是否正确。

4. 检查网络环境,确保网络连接稳定。

5. 尝试使用其他 ESP8266 模块或设备进行测试,以排除硬件问题。


举报

更多回帖

发帖
×
20
完善资料,
赚取积分