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

2936547a77771607184bbd002cfb94bb.png

上一页

1

2

下一页

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值