一個簡單的SOCKET程序的數(shù)據(jù)包結(jié)構和封解包函數(shù)
因為只是試驗用所以都是用C寫的,等界面部分完工后會用類來封裝一下
因為本人E文很爛所以變量和函數(shù)的命名是具有中國特色的,求理解.不過我注釋的很詳細了
謹以此文紀念我那坑爹的編程自學生涯......................
#include "stdio.h"
#include
//////////////////////////////數(shù)據(jù)包接構//////////////////////////////////////
//數(shù)據(jù)包類型CTOS為客戶端使用的數(shù)據(jù)包,STOC為服務端使用的數(shù)據(jù)包
#define CTOS 1
#define STOC 2
//數(shù)據(jù)包存儲管道每個包最大為2000字節(jié),其中數(shù)據(jù)載荷為最大1800字節(jié),其余留著擴展數(shù)據(jù)包頭
struct SJGD {
BYTE sjgd[2000]; //數(shù)據(jù)緩沖區(qū)
DWORD sjcd; //數(shù)據(jù)長度
};
//數(shù)據(jù)包頭大小為8字節(jié)
struct MSG_TOU {
DWORD lxid; //數(shù)據(jù)包類型
DWORD sxid; //數(shù)據(jù)包順序標號
DWORD sjbcd; //數(shù)據(jù)包長度
};
//服務端-》客戶端包
struct MSG_STOC {
DWORD cmd; //命令標識
DWORD sjbcd; //整個MSG_STOC數(shù)據(jù)包緩沖區(qū)的長度
BYTE shuju[1000]; //附加數(shù)據(jù)緩沖區(qū)
};
//客戶端-》服務器包
struct MSG_CTOS {
DWORDcmd; //命令標識
DWORD sjbcd; //整個MSG_CTOS數(shù)據(jù)包緩沖區(qū)的長度
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ù)包頭
unionMSG_DATA data; //數(shù)據(jù)緩沖區(qū)
};
/////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////
//封包函數(shù)第一個參數(shù)為數(shù)據(jù)包類型,第二個為命令標識,這是數(shù)據(jù)包的重點遠控命令會轉(zhuǎn)換成數(shù)字在這里傳輸
//第三個為數(shù)據(jù)包順序標號,第四個參數(shù)為附加數(shù)據(jù)緩沖區(qū),第五個參數(shù)為打包數(shù)據(jù)緩沖區(qū)
//作用是把數(shù)據(jù)填充成一個標準的遠控數(shù)據(jù)包為下面的發(fā)包做準備
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ù)包順序標號
if(lxid==CTOS)
{
sjb->data.msg_ctos.cmd=cmd; //填充命令標識
MoveMemory(sjb->data.msg_ctos.shuju,sjgd->sjgd,sjgd->sjcd); //填充附加數(shù)據(jù)
sjb->data.msg_ctos.sjbcd=sjgd->sjcd; //填充整個附加數(shù)據(jù)緩沖區(qū)的長度
}
if(lxid==STOC)
{
sjb->data.msg_stoc.cmd=cmd; //填充命令標識
MoveMemory(sjb->data.msg_stoc.shuju,sjgd->sjgd,sjgd->sjcd); //填充附加數(shù)據(jù)
sjb->data.msg_stoc.sjbcd=sjgd->sjcd; //填充整個附加數(shù)據(jù)緩沖區(qū)的長度
}
sjb->tou.sjbcd=20+sjgd->sjcd; //填充數(shù)據(jù)包長度
if((lxid!=CTOS)&&(lxid!=STOC)) return 0;
return 1;
}
評論