天天看點

android socket 封包,一個簡單的SOCKET程式的資料包結構和封解包函數

///

///

//發包函數第一個參數為待發資料包,第二個參數為資料管道緩沖區

//作用是把一個标準資料包以二進制的形式發送到資料管道緩沖區

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.eepw.com.cn/article/201612/324249.htm

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

android socket 封包,一個簡單的SOCKET程式的資料包結構和封解包函數

上一頁

1

2

下一頁