如何自定义协议?(100分)

  • 主题发起人 主题发起人 chimney
  • 开始时间 开始时间
C

chimney

Unregistered / Unconfirmed
GUEST, unregistred user!
客户端与服务端通讯时报文包括多种类型,如登录信息、登录成功确认信息等,准备将这些信息做成记录形式,然后用SendBuf发送,用Recivebuf接收,如登录信息记录:
type
user=record
name:string[20];
pass:string[20];
end;
当发送数据时,再各种信息上加一个信息类型标识,组成一个完整的数据包如:
type
info=record
infotype:string[10];
infounit:user;//关键是这里,因为infounit必须是可以变化的,可能是用户登录信息,也可能是登录成功确认信息等等等。。。
这种记录类型如何构造?接收端如何判断接收的信息是哪种类型的信息?
 
有人给个意见吗?
 
你可以定义一个记录类型,并定义交易码,针对不同的交易码对数据包体做相应的处理,比如:
const
DataSize = 1024;
type
TFrameData = packed record
TransCode: integer;
Data: array[0..DataSize-1] of char;
end;
然后针对不同的交易类型定义不同的Data结构类型;
如:
const
UserNameLen = 64;
PwdLen = 64;
type
TUserInfoData = record
UserName: array[0..UserNameLen-1] of char;
Password: array[0..PwdLen-1] of char;
end;
……
……

 
关注呀 !
我也很希望知道答案~
 
to softdog:
您的意思是,发送时将数据装入DATA字符数组中,然后发送FrameData记录。接收端接收到后根据TransCode判断data内容,然后将data数据分解、装入UserInfoData?
我知道这样也是可以解决我的问题,但我想知道能否可以将data改成记录类型?我总觉得这样更清晰。
 
一般来说都有一个包头,包头有包含着包类型位码的,查查以前的贴子好像有说过
 
同意softdog的定义

const
DataSize = 1024;
type
TFrameData = packed record
TransCode: integer;
Data: array[0..DataSize-1] of char;
end;

客户接受到之后

case TransCode of
0:Move(Data,你的结构体1,SizeOF(你的结构体1));
1:Move(Data,你的结构体2,SizeOF(你的结构体2));
..
..
end;
 
Record类型和array类型在底层都是一块连续得数据块,可以相互拷贝
 
计算机的数据全是BYTE,呵呵,理解到这个地步就是高手了
 
你可以这样:
(TFrameData和TUserInfoData的定义见上面的帖子)
var
AFrameData; TFrameData;
AUser: ^TUserInfoData;
begin
……
AFrameData从网络上接受数据
……
case TransCode of
USER_INFO:
begin
AUser := @AFrameData.Data;
DoSomething(AUser);
end;
end;
……
这种方法在处理大量数据的时候速度比较快,不过指针要小心处理,不要释放不该释放的指针。
也可以采用<爱元元的哥哥>的方法。
 
多人接受答案了。
 
你去找个8583包的包格式看看就知道了,好像银行都是用这种包来做的
 
后退
顶部