织梦电影网站源码,施工企业的主要负责人是本单位的,班级优化大师的利和弊,零基础网站建设入门到精通视频教出现的情况说明#xff1a;QT软件。刚开始都可以连接成功 之后连接 断开几次 就会出现连接失败 错误信息是the remote host closed the connection。the remote host closed the connection广泛原因分析 这个错误通常意味着远端 STM32 服务器主动关闭了连接。可能的原因包括QT软件。刚开始都可以连接成功 之后连接 断开几次 就会出现连接失败 错误信息是the remote host closed the connection。the remote host closed the connection广泛原因分析 这个错误通常意味着远端 STM32 服务器主动关闭了连接。可能的原因包括
STM32 服务器端代码问题未正确处理 accept() 或 recv()。STM32 端口未真正监听bind() 或 listen() 失败。STM32 服务器收到连接但立即关闭可能是 close()、shutdown()、LWIP 资源不足等问题。STM32 服务器崩溃或进入错误状态导致 Socket 断开。数据包格式错误QT 端发送的数据 STM32 解析失败并主动关闭连接。超时机制STM32 端等待超时后主动关闭连接。
解决方法
STM32 端 close() 了连接说明它检测到了错误或超时需要检查 recv() 逻辑。在 STM32 代码中accept() 后不要立即 close()而是等待客户端数据如果 recv() 返回 0通常表示客户端关闭了连接此时 STM32 也会 close(client_fd)
char buffer[256];
int bytes_received recv(client_fd, buffer, sizeof(buffer), 0);
if (bytes_received 0) {printf(客户端主动关闭连接\n);close(client_fd);
}由于一开始前几次都是可以连接成功的可以缩小原因继续分析。
可能的原因 STM32 端的 Socket 没有正确关闭导致端口资源被占用 每次 accept() 后如果 close(client_fd); 处理不当可能会导致连接数耗尽。 STM32 端可能没有正确释放 PCBProtocol Control Block导致 LWIP 资源不足。 STM32 端 TCP 连接数受限LWIP 资源问题 默认 STM32 LWIP 可用的 TCP 连接数量有限如果旧的连接没有释放新连接可能会失败。 MEMP_NUM_TCP_PCB 可能设置过小导致新连接无法分配资源。 STM32 没有正确处理 recv() 返回 0客户端主动断开 正常断开recv() 返回 0服务器应该 close(client_fd) 释放资源。 如果没有正确释放可能导致系统一直保持死连接新的连接无法建立。解决方法尝试
上述解决方法3在 lwipopts.h 中 增加 TCP 连接的数量✅ 如果 MEMP_NUM_TCP_PCB 太小STM32 端可能会因为连接数耗尽而拒绝新连接。
#define MEMP_NUM_TCP_PCB 10 // 增加 TCP 连接数
#define MEMP_NUM_TCP_PCB_LISTEN 5 // 允许最大监听连接数关闭 linger 避免 TIME_WAIT 如果 TCP 连接没有正确关闭可能会进入 TIME_WAIT 状态导致端口被占用。可以通过 setsockopt() 设置 SO_LINGER 让 STM32 端尽快释放端口✅ 这样连接关闭后不会进入 TIME_WAIT 状态防止端口被占用。
struct linger so_linger;
so_linger.l_onoff 1; // 打开 linger
so_linger.l_linger 0; // 立即关闭连接
setsockopt(client_fd, SOL_SOCKET, SO_LINGER, so_linger, sizeof(so_linger));在 QT 端强制关闭连接 QT 端每次断开连接后确保完全释放 Socket避免 QT 端 Socket 资源占用导致 STM32 端误判连接未释放。
socket-close();
socket-deleteLater();在 PC 端检查 STM32 端口状态 在 PC 上运行
netstat -an | grep 8080
#如果看到大量 TIME_WAIT 状态
tcp 0 0 192.168.1.100:8080 192.168.1.200:50000 TIME_WAIT
#说明STM32 端口没有正确释放需要用 SO_LINGER 解决。Qt 的socket 被设置成了异步这种 waitForxxxx 函数容易出问题如果你想知道数据有没有写入可以连接 bytesWritten 信号。