STM32
直播中

独当一面

10年用户 821经验值
擅长:可编程逻辑
私信 关注
[问答]

STM32F107移植了LWIP,远程主机关闭,本地的网页就打不开了怎么解决?

我使用的是STM32F107,移植了LWIP,监听了80端口作为WEB服务器,绑定1026端口作为客户端向远程的服务器不停的发送数据,现在出现以下问题:1、如果远程主机关闭,我本地的网页就打不开了,打开调试信息,提示无法分配PCB,应该是发送不成功内存没有释放,我该如何释放这个内存。

2、如果连接不成功,tcp_connect应该返回错误,为什么一直返回0,也就是ERR_OK。
3、我再tcp_connect后面添加了tcp_close,也就是无论怎样都关闭这个连接,web服务器是正常了,可是作为客户端无法向远处服务器发送数据了。

回帖(1)

jjll652

2024-5-10 16:58:57
针对您提到的问题,我将逐一给出建议和解决方案:

1. 无法分配pcb,内存没有释放:

这可能是因为TCP连接在远程主机关闭后没有正确关闭,导致内存泄漏。为了解决这个问题,您可以尝试以下方法:

- 在TCP连接关闭后,确保调用`pbuf_free()`来释放分配给TCP连接的内存。
- 使用LWIP的内存监控功能,检查内存使用情况。如果发现内存泄漏,可以逐步调试代码,找到泄漏的源头。

2. tcp_connect返回ERR_OK:

TCP连接的建立是一个三次握手过程,如果连接不成功,tcp_connect应该返回错误。但是,如果返回ERR_OK,可能是因为连接请求被远程主机接收,但没有得到响应。为了解决这个问题,您可以尝试以下方法:

- 在tcp_connect后,添加一个超时机制,如果在指定时间内没有收到远程主机的响应,就认为连接失败。
- 检查远程主机的网络配置,确保其可以接收和响应TCP连接请求。

3. tcp_close后客户端无法发送数据:

在tcp_connect后添加tcp_close可能导致TCP连接过早关闭,从而无法发送数据。为了解决这个问题,您可以尝试以下方法:

- 将tcp_close放在发送数据的代码块之后,确保数据已经发送完毕再关闭连接。
- 使用非阻塞方式发送数据,这样即使TCP连接关闭,也可以继续发送数据。

另外,您还可以考虑以下优化:

- 使用LWIP的TCP服务器和客户端示例代码,检查您的实现是否与示例代码有差异。
- 在STM32F107上使用操作系统(如FreeRTOS),以更好地管理任务和内存。

希望这些建议能帮助您解决问题。如果问题仍然存在,请提供更多详细信息,以便进一步分析和解决。
举报

更多回帖

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