程序会怎么走。
程序如下,在child_task中按switch{}里的走,断开连接都没问题。如果连接后我调试助手直接断开,看了报文cpu也有FIN应答。但之后再连程序就不正常运行了。[AppleScript]
纯文本查看 复制代码
sta
tic void server_task(void *p_arg){OS_ERR err;CPU_SR_ALLOC();struct netconn *conn = NULL;struct netconn *newconn = NULL;err_t ret = ERR_OK;conn = netconn_new(NETCONN_TCP);//初始化TCP服务器ret = netconn_bind(conn,NULL,MY_PORT);ret = netconn_listen(conn);while(1){ret = netconn_accept(conn,&newconn);//等待新的连接if(ret == ERR_OK){OS_CRITICAL_ENTER();//进入临界区OSTaskCreate( (OS_TCB * )&ChildTaskTCB,//任务控制块 (CPU_CHAR* )"child task", //任务名字 (OS_TASK_PTR )child_task, //任务函数 (void* )newconn,//传递给任务函数的参数 (OS_PRIO )CHILD_TASK_PRIO, //任务优先级 (CPU_STK * )&CHILD_TASK_STK[0],//任务堆栈基地址 (CPU_STK_SIZE)CHILD_STK_SIZE/10,//任务堆栈深度限位 (CPU_STK_SIZE)CHILD_STK_SIZE,//任务堆栈大小 (OS_MSG_QTY )0,//任务内部消息队列能够接收的最大消息数目,为0时禁止接收消息 (OS_TICK )0,//当使能时间片轮转时的时间片长度,为0时为默认长度, (void * )0,//用户补充的存储区 (OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR, //任务选项 (OS_ERR * )&err);//存放该函数错误时的返回值OS_CRITICAL_EXIT();//退出临界区 OSTaskSemPend(0,OS_OPT_PEND_BLOCKING,0,&err);//阻塞等待子任务发送其结束信号netconn_close(newconn);netconn_delete(newconn);newconn = NULL;}}}static void child_task(void *p_arg){OS_ERR err;struct netconn *newconn = (struct netconn *)p_arg;struct netbuf *inbuf = NULL;err_t ret;u8 i;while(1){ret = netconn_recv(newconn,&inbuf);//阻塞等待接收数据if(ret == ERR_OK){if(inbuf != NULL){unsigned char *dataptr = NULL;u16_t datasize;netbuf_data(inbuf,(void **)&dataptr,&datasize);if(datasize < 4)continue;//无视小于4个字节的数据switch(dataptr[0]){case 0://回显for(i=0;i
= dataptr;}netconn_write(newconn,child_send_buf[child_send_buf_cnt],i,NETCONN_NOFLAG);break;case 0xff://断开连接netbuf_delete(inbuf);OSTaskSemPost(&ServerTaskTCB,OS_OPT_POST_NONE,&err);OSTaskDel((OS_TCB*)0,&err);break;default:break;}netbuf_delete(inbuf);}else{//收到空包//OSTaskSemPost(&ServerTaskTCB,OS_OPT_POST_NONE,&err);//OSTaskDel((OS_TCB*)0,&err);}}else{OSTaskSemPost(&ServerTaskTCB,OS_OPT_POST_NONE,&err);OSTaskDel((OS_TCB*)0,&err);}}}
0