文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>服务器设计之-报文定义

服务器设计之-报文定义

时间:2006-06-21  来源:ganhig

   在linux服务器的开发中,报文的定义和设计是最基本知识,也是开发的第一步。适当的报文定义方式可以方便client和server的通信,同事也便于server针对不同的报文协议进行处理。

一、打包方式 

  由于在网络中传送的为报文,故最终在传输时都可以理解为一个含有二进制数据的缓冲区(编码形式体现为char szBuf[MAX_LEN])。经总结发现报文的定义一般分为两种,一种为无序方式,一种为有序方式。下面详细的讲一下本人的总结。

1.1 无序方式

    这种方式无序实现起来比较简单,没有严格字段边境和顺序,所有字段的含有和值均在报文中指定,各域之间采用特殊字符‘&’隔开。如:“msgid=12345678&name=ganhig&pwd=hello,world", 当报文中需有二进制数据时,需要将其进行base64编码。

    特点: 报文实现简单,灵活,可以方便的修改报文协议,如增加或删除某个域,而不太大的修改程序。

    缺点:针对所有的二进制数据都用字符串("12345678"占有了8个BYTE来存放的,浪费了网络空间,另外解报时可能效率不高。

    已知应用: 想WEB应用中的CGI参数请求就是采用这种方式。

1.2 有序方式

   这种方式实现起来比较负责,针对二进制数据采用相应的类型来存放。如

 struct BodyNode {    char msgid[2];  //用两个字节来存放msgid,即sizeof(short)个字节来存放    char name[32];    char pwd[32]; }; char szBuf[1024]; BodyNode *pbody = (BodyNode*) szBuf;   int Nmsgid = htonl(msgid); memcpy(pbody->msgid, &Nmsgid, sizeof(pbody->msgid));

  因字节序的问题, 在处理二进制数据时,一定要先将进行字节序的转换(一般的做饭是先转换成网络字节序,解包时才转换成主机字节序),如果字节指定host是怎么之间序,可以自己转换,像银行中的报文就是如此。

特点: 对网络空间的占有较小,报文也不易被破解。

已知应用: 银行终端网点的交易数据

二、报文的基本格式。

   针对第2种方式,报文的格式按逻辑组应为:报文 = 报文头 + 报文体。而整个物理组成又为 报文 = 报文长度 + 报文内容。 

较好的报文格式为:

typedef struct {    char sLength[2];    char sVersion[2];    char cCommand; }Header; typedef struct {    .... }//报文体的定义。   typedef struct {   char sSTx;   Header  stHeader;   char szBuf[MAXLEN];   char sETx; }Pkg;

 

相关阅读 更多 +
排行榜 更多 +
飞艇大战

飞艇大战

飞行射击 下载
三维空间战斗机

三维空间战斗机

飞行射击 下载
战斗机教练

战斗机教练

飞行射击 下载