OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3204|回复: 2

【lwip】协议栈API下,收到对端的FIN握手包

[复制链接]

69

主题

978

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3761
金钱
3761
注册时间
2015-4-26
在线时间
761 小时
发表于 2016-9-28 22:19:15 | 显示全部楼层 |阅读模式
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]
我有故事,你有酒吗
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

69

主题

978

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3761
金钱
3761
注册时间
2015-4-26
在线时间
761 小时
 楼主| 发表于 2016-9-28 22:19:16 | 显示全部楼层
回复

使用道具 举报

69

主题

978

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3761
金钱
3761
注册时间
2015-4-26
在线时间
761 小时
 楼主| 发表于 2016-9-28 22:48:55 | 显示全部楼层
新的问题,如一楼贴的程序。对端发送FIN报文,lwip知道,可我写的程序不知道。现在的问题是如何能知道对端发送了FIN
我有故事,你有酒吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-24 23:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表