论坛元老
- 积分
- 3761
- 金钱
- 3761
- 注册时间
- 2015-4-26
- 在线时间
- 761 小时
|
1金钱
程序会怎么走。
程序如下,在child_task中按switch{}里的走,断开连接都没问题。如果连接后我调试助手直接断开,看了报文cpu也有FIN应答。但之后再连程序就不正常运行了。[mw_shl_code=applescript,true]static 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<datasize;i++)
{
child_send_buf[child_send_buf_cnt] = 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);
}
}
}[/mw_shl_code] |
|