关于Socket自定义数据包的问题。(50分)

  • 主题发起人 主题发起人 zdexinet
  • 开始时间 开始时间
Z

zdexinet

Unregistered / Unconfirmed
GUEST, unregistred user!
现在我做了一个自定义数据包的Socket收发。但是在写数据包头的PacketLength(数据包总长度)的时候,值老是不对。

自定义数据包头/包体如下:
代码:
  TSMGPHead=Record
    PacketLength            :Integer;
    RequestID               :Integer;
    SequenceID              :Integer;
  end;
  TSMGPLogin=Record
    ClientId                :array[0..7] of Char;
    AuthenticatorClient     :array[0..15] of Char;
    LoginMode               :Byte;
    TimeStamp               :Integer;
    Version                 :Byte;
  end;

ClientSocket程序如下:
代码:
  FillChar(cSMGPHead, SizeOf(cSMGPHead), 0);
  cPacketLength:=SizeOf(cSMGPHead)+SizeOf(cSMGPLogin);

  cSMGPHead.PacketLength:=htonl(cPacketLength);
  cSMGPHead.RequestID:=htonl(SMGP_Login);
  cSMGPHead.SequenceID:=htonl(cPacketLength);

  FillChar(cSMGPLogin, SizeOf(cSMGPLogin), 0);
  DateTimeToString(cLoginTimeStamp,'mmddhhnnss',Now());
  cLoginClientID:='CPSMGW01';
  cLoginAuthClient:=MD5Print(MD5String(cLoginClientID+'0000000'+'zengdexin'+cLoginTimeStamp));

  StrPCopy(cSMGPLogin.ClientID,cLoginClientID);
  StrPCopy(cSMGPLogin.AuthenticatorClient,cLoginAuthClient);
  cSMGPLogin.LoginMode:=htonl(2);
  cSMGPLogin.TimeStamp:=htonl(StrToInt(cLoginTimeStamp));
  cSMGPLogin.Version:=htonl(2);

  StreamClient.WriteBuffer(cSMGPHead,SizeOf(cSMGPHead));
  StreamClient.WriteBuffer(cSMGPLogin,SizeOf(cSMGPLogin));

代码:
  MemoClient.Lines.Add('Head PacketLength:'+IntToStr(ntohl(cSMGPHead.PacketLength)));
整个数据包应该是48个字节。
但现在,在ClientSocket里取包头长度值和ServerSocket里取包头长度值是相同的。但是这个值不是48
在输出查看结果的时候。这个PacketLength好像是随机的。如:929116515 1680881508 808990310

其它值接都正常。

其次是如果我改数据包头结构如下。那PacketLength值正常。Temp值(即第一个值)又会出现混乱。请问各位大侠。怎么回事?怎么搞定呢?
代码:
  TSMGPHead=Record
    Temp                    :Byte;
    PacketLength            :Integer;
    RequestID               :Integer;
    SequenceID              :Integer;
  end;
 
晕啊?怎么没有人回我啊。
 
大概是tcp传输时做了分割
 
你发短信啊??
将 TSMGPHead=Record 改为 TSMGPHead= Packed Record 试试
 
是做短信。小灵通的。
昨天晚上回家搞定了。
是我的变量类型和Record的不一样。所以才出错。:)
后来长度不对。加了Packed Record。但是包体没了。
再加了一个Packed Record把包头包体做到一起。
一次发送。
现在正确了。:)
谢谢两位。一人分一半
 
后退
顶部