完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
int8_t send_http_request(char* sendBuf,void (*handle_function)(cJSON* valid_data))
{ IP4_ADDR(&server_ipaddr,MAIN_SERVER_IP_ADDR0,MAIN_SERVER_IP_ADDR1,MAIN_SERVER_IP_ADDR2,MAIN_SERVER_IP_ADDR3); server_port = MAIN_SERVER_PORT; tcp_clientconn = netconn_new(NETCONN_TCP); if(tcp_clientconn==NULL) { printf("新建连接失败rn"); return; } errCode = netconn_connect(tcp_clientconn,&server_ipaddr,server_port); if(errCode == ERR_OK) { finalRecvBuf = (char*)mymalloc(4000*sizeof(char));//定义finalRecvBuf长度是数据包的总长度 memset(finalRecvBuf,0x00,4000); tcp_clientconn->send_timeout = 3000;//发送超时时间设定3秒 //NETCONN_COPY,会将数据拷贝给内核进程,这种方式,用户可以直接复用buf errCode = netconn_write(tcp_clientconn,sendBuf,strlen((const char*) sendBuf),NETCONN_NOCOPY); // if(errCode == ERR_OK) // { // DEBUG_PRINT_VAR("send sucessrn"); // } // else // { // DEBUG_PRINT_VAR("send failurern"); // } tcp_clientconn->recv_timeout = 5000;//接收超时时间设定5秒 // netconn_recv(tcp_clientconn,&recevingBuf); //循环接收数据 while(1) { errCode = netconn_recv(tcp_clientconn,&recevingBuf); printf("errCode--->%drn",errCode); if(errCode == ERR_OK && recevingBuf!=NULL) { taskENTER_CRITICAL(); //进入临界区 for(;;) { //若第一个数据包的长度和总长度大小相等,直接拷贝出来 if(recevingBuf->p->tot_len == recevingBuf->p->len) { // DEBUG_PRINT_VAR("尾包数据包------->%srn",(char *)recevingBuf->p->payload); strncat(finalRecvBuf,(char *)recevingBuf->p->payload,recevingBuf->p->tot_len); break; } //若第一个数据包的长度和总长度大小不相等,需要循环将每个包里的内容拼接到buf中 else { // DEBUG_PRINT_VAR("单个数据包------->%srn",(char *)recevingBuf->p->payload); strncat(finalRecvBuf,(char *)recevingBuf->p->payload,recevingBuf->p->len); // DEBUG_PRINT_VAR("p->payload 累加buf---->%srn",finalRecvBuf); // DEBUG_PRINT_VAR("数据包长度--->%drn",strlen(finalRecvBuf)); recevingBuf->p = recevingBuf->p->next; } } printf("接收正常rn"); // printf("p->payload total内容是 ---->%s,接收数据长度--->%drn",finalRecvBuf,strlen(finalRecvBuf)); netbuf_delete(recevingBuf);//需要在此时释放recevingBuf否则会导致内存异常 recevingBuf = NULL; taskEXIT_CRITICAL(); } else if(errCode == ERR_MEM) { break; } else if(errCode == ERR_CLSD)//服务器关闭连接 { errCode = 0; netconn_close(tcp_clientconn); netconn_delete(tcp_clientconn); break; } else if(errCode == ERR_TIMEOUT)//超时也break出去 { printf("接收超时rn"); errCode = -1; continue; } } } 这个函数接收1000字节以上的数据,能够成功3、4次,之后便一直是超时,很郁闷,求指点迷津 |
|
相关推荐
2个回答
|
|
记录一下,目前已经解决了这个问题。是lwip内存分配策略导致的问题,将pbuf_pool_bufsize 改为了LWIP_MEM_ALIGN_SIZE(TCP_MSS+40+PBUF_LINK_HLEN),并将分配策略改为MEMP_MEM_MALLOC
|
|
|
|
而且是不可恢复的超时,即便新建连接、发送、接收,还是超时,逆天了。ps:接收少量内容<200字节没用这个现象
|
|
|
|
只有小组成员才能发言,加入小组>>
如何使用STM32+nrf24l01架构把有线USB设备无线化?
2568 浏览 7 评论
请问能利用51单片机和nRF24L01模块实现实时语音无线传输吗?
2361 浏览 5 评论
3208 浏览 3 评论
2836 浏览 8 评论
为什么ucosii上移植lwip后系统进入了HardFault_Handler?
2787 浏览 4 评论
请教各位大咖:有没有接收频率32M左右的芯片推荐的?先感谢啦!
663浏览 1评论
900浏览 0评论
1022浏览 0评论
666浏览 0评论
496浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-21 14:46 , Processed in 0.862441 second(s), Total 47, Slave 41 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号