久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

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

作者:佚名   來(lái)源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2013年12月17日   【字體:

練習(xí)寫(xiě)套接字通信程序時(shí)候?qū)懙囊欢未a,本來(lái)想寫(xiě)個(gè)聊天室但寫(xiě)來(lái)寫(xiě)去進(jìn)度卡在界面上接節(jié)下來(lái)都是通信部分的代碼
因?yàn)橹皇窃囼?yàn)用所以都是用C寫(xiě)的,等界面部分完工后會(huì)用類來(lái)封裝一下
因?yàn)楸救耍盼暮軤所以變量和函數(shù)的命名是具有中國(guó)特色的,求理解.不過(guò)我注釋的很詳細(xì)了
謹(jǐn)以此文紀(jì)念我那坑爹的編程自學(xué)生涯......................
 
#include "stdio.h"
#include <windows.h>
//////////////////////////////數(shù)據(jù)包接構(gòu)//////////////////////////////////////
//數(shù)據(jù)包類型CTOS為客戶端使用的數(shù)據(jù)包,STOC為服務(wù)端使用的數(shù)據(jù)包
#define CTOS 1
#define STOC 2
//數(shù)據(jù)包存儲(chǔ)管道每個(gè)包最大為2000字節(jié),其中數(shù)據(jù)載荷為最大1800字節(jié),其余留著擴(kuò)展數(shù)據(jù)包頭
struct SJGD {
 BYTE sjgd[2000];  //數(shù)據(jù)緩沖區(qū)
 DWORD sjcd;    //數(shù)據(jù)長(zhǎng)度
};
//數(shù)據(jù)包頭大小為8字節(jié)
struct MSG_TOU {
     DWORD lxid; //數(shù)據(jù)包類型
     DWORD sxid;  //數(shù)據(jù)包順序標(biāo)號(hào)
  DWORD sjbcd; //數(shù)據(jù)包長(zhǎng)度
};
//服務(wù)端-》客戶端包
struct MSG_STOC {
    DWORD cmd;    //命令標(biāo)識(shí)
 DWORD sjbcd; //整個(gè)MSG_STOC數(shù)據(jù)包緩沖區(qū)的長(zhǎng)度
 BYTE shuju[1000];   //附加數(shù)據(jù)緩沖區(qū)
};
//客戶端-》服務(wù)器包
struct MSG_CTOS {
    DWORD cmd;    //命令標(biāo)識(shí)
 DWORD sjbcd; //整個(gè)MSG_CTOS數(shù)據(jù)包緩沖區(qū)的長(zhǎng)度
 BYTE shuju[1800]; //附加數(shù)據(jù)緩沖區(qū)
};
//共用體
 union MSG_DATA {
      struct MSG_STOC msg_stoc;
   struct MSG_CTOS msg_ctos;
    };
//完整數(shù)據(jù)包
struct SJB {
 struct MSG_TOU tou; //數(shù)據(jù)包頭
 union MSG_DATA data;  //數(shù)據(jù)緩沖區(qū)
};
/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
//封包函數(shù)第一個(gè)參數(shù)為數(shù)據(jù)包類型,第二個(gè)為命令標(biāo)識(shí),這是數(shù)據(jù)包的重點(diǎn)遠(yuǎn)控命令會(huì)轉(zhuǎn)換成數(shù)字在這里傳輸
//第三個(gè)為數(shù)據(jù)包順序標(biāo)號(hào),第四個(gè)參數(shù)為附加數(shù)據(jù)緩沖區(qū),第五個(gè)參數(shù)為打包數(shù)據(jù)緩沖區(qū)
//作用是把數(shù)據(jù)填充成一個(gè)標(biāo)準(zhǔn)的遠(yuǎn)控?cái)?shù)據(jù)包為下面的發(fā)包做準(zhǔn)備
int Fengbao(DWORD lxid,DWORD cmd,DWORD sxid,struct SJGD*sjgd,struct SJB*sjb)
{
 sjb->tou.lxid=lxid;  //填充數(shù)據(jù)包類型
 sjb->tou.sxid=sxid;  //填充數(shù)據(jù)包順序標(biāo)號(hào)
 if(lxid==CTOS)
 {
  sjb->data.msg_ctos.cmd=cmd;  //填充命令標(biāo)識(shí)
  MoveMemory(sjb->data.msg_ctos.shuju,sjgd->sjgd,sjgd->sjcd);  //填充附加數(shù)據(jù)
  sjb->data.msg_ctos.sjbcd=sjgd->sjcd;  //填充整個(gè)附加數(shù)據(jù)緩沖區(qū)的長(zhǎng)度
 }
 if(lxid==STOC)
 {
  sjb->data.msg_stoc.cmd=cmd; //填充命令標(biāo)識(shí)
        MoveMemory(sjb->data.msg_stoc.shuju,sjgd->sjgd,sjgd->sjcd);  //填充附加數(shù)據(jù)
  sjb->data.msg_stoc.sjbcd=sjgd->sjcd;  //填充整個(gè)附加數(shù)據(jù)緩沖區(qū)的長(zhǎng)度
 }
 sjb->tou.sjbcd=20+sjgd->sjcd;   //填充數(shù)據(jù)包長(zhǎng)度
 if((lxid!=CTOS)&&(lxid!=STOC)) return 0;
 return 1;
}
///////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////
//發(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ù)包長(zhǎng)度
        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ū)的長(zhǎng)度    
        MoveMemory(sjgd->sjgd+20,sjb->data.msg_ctos.shuju,sjb->data.msg_ctos.sjbcd); //填充附加數(shù)據(jù)
        sjgd->sjcd=sjb->tou.sjbcd; //更新數(shù)據(jù)管道長(zhǎng)度數(shù)據(jù)
     return 1;
 }
 if(sjb->tou.lxid==STOC)
 {
        MoveMemory(sjgd->sjgd+8,&sjb->tou.sjbcd,4);//填充數(shù)據(jù)包長(zhǎng)度
        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ū)的長(zhǎng)度
        MoveMemory(sjgd->sjgd+20,sjb->data.msg_ctos.shuju,sjb->data.msg_stoc.sjbcd); //填充附加數(shù)據(jù)
        sjgd->sjcd=sjb->tou.sjbcd; //更新數(shù)據(jù)管道長(zhǎng)度數(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ù)包長(zhǎng)度
 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ū)的長(zhǎng)度
  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ū)的長(zhǎng)度
  MoveMemory(sjb->data.msg_stoc.shuju,sjgd->sjgd+20,sjb->data.msg_ctos.sjbcd); //解封附加數(shù)據(jù)
  return 1;
 }
 return 0;
}
////////////////////////////////////////////////////////////////////////////////////////

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

關(guān)閉窗口

相關(guān)文章

主站蜘蛛池模板: 大久 | 国产人免费人成免费视频 | 欧美一区二区视频 | 男女免费观看在线爽爽爽视频 | 成人精品一区亚洲午夜久久久 | 欧美日韩精品一区 | 免费国产一区二区 | 在线观看视频你懂得 | 国产精品日日做人人爱 | 欧美一级黄 | 日韩av在线不卡 | 蜜桃av一区二区三区 | 成人在线欧美 | 97人澡人人添人人爽欧美 | 亚洲成人av在线播放 | 91av在线视频观看 | 天天操天天干天天透 | 欧美日韩亚洲国产 | 999久久久 | 91av亚洲 | www.国产一区| 欧美精品一区在线观看 | 成人午夜精品 | 国产精品一级 | 日日摸夜夜添夜夜添特色大片 | 亚洲国产成人av好男人在线观看 | 精品美女视频在免费观看 | 成人免费视频一区二区 | 久久久久久久久国产 | www.精品一区 | 丁香婷婷综合激情五月色 | 亚洲 欧美 日韩在线 | 亚洲精品国产成人 | 成人免费福利 | 日韩欧美一区二区三区免费观看 | 狠狠色综合久久丁香婷婷 | 国产91在线 | 中日 | 一区二区三区视频 | 91精品国产色综合久久不卡蜜臀 | 久久久久一区二区三区四区 | 手机av在线 |