新聞中心

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

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

        作者: 時間:2016-12-01 來源:網絡 收藏
        練習寫套接字通信程序時候寫的一段代碼,本來想寫個聊天室但寫來寫去進度卡在界面上接節下來都是通信部分的代碼

        因為只是試驗用所以都是用C寫的,等界面部分完工后會用類來封裝一下
        因為本人E文很爛所以變量和函數的命名是具有中國特色的,求理解.不過我注釋的很詳細了
        謹以此文紀念我那坑爹的編程自學生涯......................

        #include "stdio.h"
        #include
        //////////////////////////////數據包接構//////////////////////////////////////
        //數據包類型CTOS為客戶端使用的數據包,STOC為服務端使用的數據包
        #define CTOS 1
        #define STOC 2
        //數據包存儲管道每個包最大為2000字節,其中數據載荷為最大1800字節,其余留著擴展數據包頭
        struct SJGD {
        BYTE sjgd[2000]; //數據緩沖區
        DWORD sjcd; //數據長度
        };
        //數據包頭大小為8字節
        struct MSG_TOU {
        DWORD lxid; //數據包類型
        DWORD sxid; //數據包順序標號
        DWORD sjbcd; //數據包長度
        };
        //服務端-》客戶端包
        struct MSG_STOC {
        DWORD cmd; //命令標識
        DWORD sjbcd; //整個MSG_STOC數據包緩沖區的長度
        BYTE shuju[1000]; //附加數據緩沖區
        };
        //客戶端-》服務器包
        struct MSG_CTOS {
        DWORDcmd; //命令標識
        DWORD sjbcd; //整個MSG_CTOS數據包緩沖區的長度
        BYTE shuju[1800]; //附加數據緩沖區
        };
        //共用體
        union MSG_DATA {
        struct MSG_STOC msg_stoc;
        struct MSG_CTOS msg_ctos;
        };
        //完整數據包
        struct SJB {
        struct MSG_TOU tou; //數據包頭
        unionMSG_DATA data; //數據緩沖區
        };
        /////////////////////////////////////////////////////////////////////////////////
        /////////////////////////////////////////////////////////////////////////////////
        //封包函數第一個參數為數據包類型,第二個為命令標識,這是數據包的重點遠控命令會轉換成數字在這里傳輸
        //第三個為數據包順序標號,第四個參數為附加數據緩沖區,第五個參數為打包數據緩沖區
        //作用是把數據填充成一個標準的遠控數據包為下面的發包做準備
        int Fengbao(DWORD lxid,DWORD cmd,DWORD sxid,struct SJGD*sjgd,struct SJB*sjb)
        {
        sjb->tou.lxid=lxid; //填充數據包類型
        sjb->tou.sxid=sxid; //填充數據包順序標號
        if(lxid==CTOS)
        {
        sjb->data.msg_ctos.cmd=cmd; //填充命令標識
        MoveMemory(sjb->data.msg_ctos.shuju,sjgd->sjgd,sjgd->sjcd); //填充附加數據
        sjb->data.msg_ctos.sjbcd=sjgd->sjcd; //填充整個附加數據緩沖區的長度
        }
        if(lxid==STOC)
        {
        sjb->data.msg_stoc.cmd=cmd; //填充命令標識
        MoveMemory(sjb->data.msg_stoc.shuju,sjgd->sjgd,sjgd->sjcd); //填充附加數據
        sjb->data.msg_stoc.sjbcd=sjgd->sjcd; //填充整個附加數據緩沖區的長度
        }
        sjb->tou.sjbcd=20+sjgd->sjcd; //填充數據包長度
        if((lxid!=CTOS)&&(lxid!=STOC)) return 0;
        return 1;
        }


        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 灵石县| 广汉市| 绥阳县| 大英县| 长顺县| 漳浦县| 南昌市| 琼海市| 和顺县| 桃江县| 稻城县| 富蕴县| 定州市| 辽源市| 肇源县| 托克托县| 宁津县| 临武县| 县级市| 健康| 通海县| 镇雄县| 新安县| 于都县| 汽车| 盐源县| 利辛县| 定兴县| 齐河县| 墨玉县| 安阳县| 永登县| 张家港市| 沧源| 鄢陵县| 徐闻县| 昭苏县| 兰西县| 安丘市| 广水市| 武鸣县|