<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 一個(gè)簡單的SOCKET程序的數(shù)據(jù)包結(jié)構(gòu)和封解包函數(shù)

          一個(gè)簡單的SOCKET程序的數(shù)據(jù)包結(jié)構(gòu)和封解包函數(shù)

          作者: 時(shí)間:2016-12-01 來源:網(wǎng)絡(luò) 收藏

          ///////////////////////////////////////////////////////////////////////////////////
          ///////////////////////////////////////////////////////////////////////////////////
          //發(fā)包函數(shù)第一個(gè)參數(shù)為待發(fā)數(shù)據(jù)包,第二個(gè)參數(shù)為數(shù)據(jù)管道緩沖區(qū)
          //作用是把一個(gè)標(biāo)準(zhǔn)數(shù)據(jù)包以二進(jìn)制的形式發(fā)送到數(shù)據(jù)管道緩沖區(qū)
          int Fabao(struct SJB*sjb,struct SJGD*sjgd)
          {
          MoveMemory(sjgd->sjgd,&sjb->tou.lxid,4); //填充數(shù)據(jù)包類型
          MoveMemory(sjgd->sjgd+4,&sjb->tou.sxid,4);//填充數(shù)據(jù)包順序標(biāo)號(hào)
          if(sjb->tou.lxid==CTOS)
          {
          MoveMemory(sjgd->sjgd+8,&sjb->tou.sjbcd,4); //填充數(shù)據(jù)包長度
          MoveMemory(sjgd->sjgd+12,&sjb->data.msg_ctos.cmd,4);//填充命令標(biāo)識(shí)
          MoveMemory(sjgd->sjgd+16,&sjb->data.msg_ctos.sjbcd,4);//填充整個(gè)附加數(shù)據(jù)緩沖區(qū)的長度
          MoveMemory(sjgd->sjgd+20,sjb->data.msg_ctos.shuju,sjb->data.msg_ctos.sjbcd); //填充附加數(shù)據(jù)
          sjgd->sjcd=sjb->tou.sjbcd; //更新數(shù)據(jù)管道長度數(shù)據(jù)
          return 1;
          }
          if(sjb->tou.lxid==STOC)
          {
          MoveMemory(sjgd->sjgd+8,&sjb->tou.sjbcd,4);//填充數(shù)據(jù)包長度
          MoveMemory(sjgd->sjgd+12,&sjb->data.msg_stoc.cmd,4);//填充命令標(biāo)識(shí)
          MoveMemory(sjgd->sjgd+16,&sjb->data.msg_stoc.sjbcd,4);//填充整個(gè)附加數(shù)據(jù)緩沖區(qū)的長度
          MoveMemory(sjgd->sjgd+20,sjb->data.msg_ctos.shuju,sjb->data.msg_stoc.sjbcd); //填充附加數(shù)據(jù)
          sjgd->sjcd=sjb->tou.sjbcd; //更新數(shù)據(jù)管道長度數(shù)據(jù)
          return 1;
          }
          return 0;
          }
          ////////////////////////////////////////////////////////////////////////////////////
          ////////////////////////////////////////////////////////////////////////////////////
          //函數(shù)作用是直接從內(nèi)存讀取一個(gè)4字節(jié)的整數(shù),為下面的解包做準(zhǔn)備
          int hex_int(char c) //從內(nèi)存讀取一個(gè)1字節(jié)的整數(shù)
          {
          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) //從內(nèi)存讀取一個(gè)4節(jié)的整數(shù)
          {
          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;
          }
          ///////////////////////////////////////////////////////////////////////////////////
          ///////////////////////////////////////////////////////////////////////////////////
          //解包函數(shù)第一個(gè)參數(shù)是待解包的數(shù)據(jù)管道緩沖區(qū),第二個(gè)參數(shù)為解包數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)
          //函數(shù)作用是把數(shù)據(jù)管道中的數(shù)據(jù)解封為一個(gè)標(biāo)準(zhǔn)的遠(yuǎn)控?cái)?shù)據(jù)包,用以控制程序流程
          int Jiebao(struct SJGD*sjgd,struct SJB*sjb)
          {
          sjb->tou.lxid=hex_dw(sjgd->sjgd); //解封數(shù)據(jù)包類型
          sjb->tou.sxid=hex_dw(sjgd->sjgd+4); //解封數(shù)據(jù)包順序標(biāo)號(hào)
          sjb->tou.sjbcd=hex_dw(sjgd->sjgd+8); //解封數(shù)據(jù)包長度
          if(sjb->tou.lxid==CTOS)
          {
          sjb->data.msg_ctos.cmd=hex_dw(sjgd->sjgd+12); //解封命令標(biāo)識(shí)
          sjb->data.msg_ctos.sjbcd=hex_dw(sjgd->sjgd+16); //解封整個(gè)附加數(shù)據(jù)緩沖區(qū)的長度
          MoveMemory(sjb->data.msg_ctos.shuju,sjgd->sjgd+20,sjb->data.msg_ctos.sjbcd); //解封附加數(shù)據(jù)
          return 1;
          }
          if(sjb->tou.lxid==STOC)
          {
          sjb->data.msg_stoc.cmd=hex_dw(sjgd->sjgd+12); //解封命令標(biāo)識(shí)
          sjb->data.msg_stoc.sjbcd=hex_dw(sjgd->sjgd+16); //解封整個(gè)附加數(shù)據(jù)緩沖區(qū)的長度
          MoveMemory(sjb->data.msg_stoc.shuju,sjgd->sjgd+20,sjb->data.msg_ctos.sjbcd); //解封附加數(shù)據(jù)
          return 1;
          }
          return 0;
          }
          ////////////////////////////////////////////////////////////////////////////////////////

          本文引用地址:http://www.ex-cimer.com/article/201612/324249.htm

          這篇是服務(wù)器端的收發(fā)線程函數(shù)http://www.51hei.com/mcu/2611.html


          上一頁 1 2 下一頁

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();