初级会员
- 积分
- 155
- 金钱
- 155
- 注册时间
- 2019-10-19
- 在线时间
- 46 小时
|
1金钱
当STM32可以和网络助手正常收发数据后,按wakeup退出,退出while,执行了
tcp_client_connection_close(tcppcb,0);//关闭TCP Client连接 es根本不会释放 PCB在abort中移除
那么tcp_client_connected中申请的es空间如何释放?
//lwIP TCP连接建立后调用回调函数 是收到了PC发过来的SYNACK数据帧,netif->input ip_input tcp_input 在tcp_in.c中的TCP_EVENT_CONNECTED(pcb, ERR_OK, err);调用
err_t tcp_client_connected(void *arg, struct tcp_pcb *tpcb, err_t err)
{
struct tcp_client_struct *es=NULL; //硬石电子也是类似的结构体 是抄4,LWIP学习资料\STM32F4x7_ETH_LwIP_V1.1.0\Project\Standalone\tcp_echo_client echo
printf("tcp_client_connected\r\n");//pnhhit add
if(err==ERR_OK)
{
es=(struct tcp_client_struct*)mem_malloc(sizeof(struct tcp_client_struct)); //申请内存 断开连接时,释放 tcp_client_struct是自定义的
if(es) //内存申请成功 tcp_client_connection_close中释放es
{
es->state=ES_TCPCLIENT_CONNECTED;//状态为连接成功
es->pcb=tpcb;
es->p=NULL; //pnhhit 下面的函数都是注册到 tpcb中,给lwip调用 es其实整个LWIP内部都没有配置,只有读取。所以完全是用户自定义的应用
tcp_arg(tpcb,es); //使用es更新tpcb的callback_arg pnhhit 所有的回调函数参数都放在es结构体中 指向用户自定义数据,在函数回调时使用
tcp_recv(tpcb,tcp_client_recv); //初始化LwIP的tcp_recv回调功能
tcp_err(tpcb,tcp_client_error); //初始化tcp_err()回调函数
tcp_sent(tpcb,tcp_client_sent); //初始化LwIP的tcp_sent回调功能
tcp_poll(tpcb,tcp_client_poll,1); //初始化LwIP的tcp_poll回调功能
tcp_client_flag|=1<<5; //标记连接到服务器了
err=ERR_OK;
}else
{
tcp_client_connection_close(tpcb,es);//关闭连接 es这里其实也是0
err=ERR_MEM; //返回内存分配错误
}
}else
{
tcp_client_connection_close(tpcb,0);//关闭连接 pnhhit 注意es和0
}
return err;
}
|
|