新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 一個簡單的SOCKET程序的數據包結構和封解包函數

        一個簡單的SOCKET程序的數據包結構和封解包函數

        作者: 時間:2016-12-01 來源:網絡 收藏

        ///////////////////////////////////////////////////////////////////////////////////
        ///////////////////////////////////////////////////////////////////////////////////
        //發包函數第一個參數為待發數據包,第二個參數為數據管道緩沖區
        //作用是把一個標準數據包以二進制的形式發送到數據管道緩沖區
        int Fabao(struct SJB*sjb,struct SJGD*sjgd)
        {
        MoveMemory(sjgd->sjgd,&sjb->tou.lxid,4); //填充數據包類型
        MoveMemory(sjgd->sjgd+4,&sjb->tou.sxid,4);//填充數據包順序標號
        if(sjb->tou.lxid==CTOS)
        {
        MoveMemory(sjgd->sjgd+8,&sjb->tou.sjbcd,4); //填充數據包長度
        MoveMemory(sjgd->sjgd+12,&sjb->data.msg_ctos.cmd,4);//填充命令標識
        MoveMemory(sjgd->sjgd+16,&sjb->data.msg_ctos.sjbcd,4);//填充整個附加數據緩沖區的長度
        MoveMemory(sjgd->sjgd+20,sjb->data.msg_ctos.shuju,sjb->data.msg_ctos.sjbcd); //填充附加數據
        sjgd->sjcd=sjb->tou.sjbcd; //更新數據管道長度數據
        return 1;
        }
        if(sjb->tou.lxid==STOC)
        {
        MoveMemory(sjgd->sjgd+8,&sjb->tou.sjbcd,4);//填充數據包長度
        MoveMemory(sjgd->sjgd+12,&sjb->data.msg_stoc.cmd,4);//填充命令標識
        MoveMemory(sjgd->sjgd+16,&sjb->data.msg_stoc.sjbcd,4);//填充整個附加數據緩沖區的長度
        MoveMemory(sjgd->sjgd+20,sjb->data.msg_ctos.shuju,sjb->data.msg_stoc.sjbcd); //填充附加數據
        sjgd->sjcd=sjb->tou.sjbcd; //更新數據管道長度數據
        return 1;
        }
        return 0;
        }
        ////////////////////////////////////////////////////////////////////////////////////
        ////////////////////////////////////////////////////////////////////////////////////
        //函數作用是直接從內存讀取一個4字節的整數,為下面的解包做準備
        int hex_int(char c) //從內存讀取一個1字節的整數
        {
        if((c>=A)&&(c<=F))
        {
        return (int)(c-A+10);
        }
        if((c>=0)&&(c<=9))
        {
        return (int)(c-0);
        }
        return 0;
        }
        DWORD hex_dw(BYTE*hex) //從內存讀取一個4節的整數
        {
        DWORD D=0;
        char x[2];
        sprintf(x,"%.2X",hex[0]);
        D+=hex_int(x[1]);
        D+=hex_int(x[0])*16;
        sprintf(x,"%.2X",hex[1]);
        D+=hex_int(x[1])*16*16;
        D+=hex_int(x[0])*16*16*16;
        sprintf(x,"%.2X",hex[2]);
        D+=hex_int(x[1])*16*16*16*16;
        D+=hex_int(x[0])*16*16*16*16*16;
        sprintf(x,"%.2X",hex[3]);
        D+=hex_int(x[1])*16*16*16*16*16*16;
        D+=hex_int(x[0])*16*16*16*16*16*16*16;
        return D;
        }
        ///////////////////////////////////////////////////////////////////////////////////
        ///////////////////////////////////////////////////////////////////////////////////
        //解包函數第一個參數是待解包的數據管道緩沖區,第二個參數為解包數據存儲結構
        //函數作用是把數據管道中的數據解封為一個標準的遠控數據包,用以控制程序流程
        int Jiebao(struct SJGD*sjgd,struct SJB*sjb)
        {
        sjb->tou.lxid=hex_dw(sjgd->sjgd); //解封數據包類型
        sjb->tou.sxid=hex_dw(sjgd->sjgd+4); //解封數據包順序標號
        sjb->tou.sjbcd=hex_dw(sjgd->sjgd+8); //解封數據包長度
        if(sjb->tou.lxid==CTOS)
        {
        sjb->data.msg_ctos.cmd=hex_dw(sjgd->sjgd+12); //解封命令標識
        sjb->data.msg_ctos.sjbcd=hex_dw(sjgd->sjgd+16); //解封整個附加數據緩沖區的長度
        MoveMemory(sjb->data.msg_ctos.shuju,sjgd->sjgd+20,sjb->data.msg_ctos.sjbcd); //解封附加數據
        return 1;
        }
        if(sjb->tou.lxid==STOC)
        {
        sjb->data.msg_stoc.cmd=hex_dw(sjgd->sjgd+12); //解封命令標識
        sjb->data.msg_stoc.sjbcd=hex_dw(sjgd->sjgd+16); //解封整個附加數據緩沖區的長度
        MoveMemory(sjb->data.msg_stoc.shuju,sjgd->sjgd+20,sjb->data.msg_ctos.sjbcd); //解封附加數據
        return 1;
        }
        return 0;
        }
        ////////////////////////////////////////////////////////////////////////////////////////

        本文引用地址:http://www.104case.com/article/201612/324249.htm

        這篇是服務器端的收發線程函數http://www.51hei.com/mcu/2611.html


        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 黑山县| 丰镇市| 罗山县| 宝鸡市| 鹿邑县| 汉川市| 锡林郭勒盟| 罗城| 体育| 额尔古纳市| 城步| 五河县| 南平市| 武陟县| 将乐县| 沈阳市| 农安县| 忻州市| 通榆县| 广河县| 湘潭县| 北安市| 白水县| 神农架林区| 武隆县| 塔河县| 台北县| 禹城市| 泽普县| 定远县| 左贡县| 襄城县| 泸州市| 双江| 沈阳市| 南城县| 乐昌市| 贵定县| 康平县| 调兵山市| 土默特左旗|