1通讯规则
1、 通讯软件作为通讯的服务端,开放端口进行侦听;端口可配置;
2、 前端设备作为通讯的客户端与服务器进行连接。 数据包格式:
类型 说明 备注
Unsigned long 包头 0xaaabbbbb
Unsigned long 数据包长度 包长度之后到包尾之前的所有字段的长度
Unsigned long 命令码 数据包的含义
…… 数据内容
Unsigned long 包尾 0xaaabbbbc命令码有 101、102、103、104 不同的命令码对应不同的数据内容。其中最麻烦的如果命令码是103, 后面的数据内容就是一个结构体+图片序号+图片大小+图片内容 。 我到底该怎么去解析把结构体跟图片都取出来呢???

解决方案 »

  1.   

    先假设你接收的数据报文保存在一个类型为TMemoryStream的变量FStream中:
    1、移动流的指针
      FStream.Seek(0, soFromBeginning);
    2、定义一个Longword类型的变量FPacketHead
      FStream.ReadBuffer(FPacketHead, SizeOf(FPacketHead);  //得到数据包包头
    3、定义一个Longword类型的变量FPacketLeng
      FStream.ReadBuffer(FPacketLeng, SizeOf(FPacketLeng);  //得到数据包长度
    4、定义一个Longword类型的变量FPacketCode
      FStream.ReadBuffer(FPacketCode, SizeOf(FPacketLeng);  //得到命令码
    5、根据命令码的不同执行不同的操作
      case FPacketCode of
        101:
          begin
            //...
          end;
        102:
          begin
            //...
          end;
        103:
          begin
            //FRec为结构体,FIdx为图片序号,FSize为图片大小,FImg为图片内容
            FStream.ReadBuffer(FRec, SizeOf(FRec));
            FStream.ReadBuffer(FIdx, SizeOf(FIdx));
            FStream.ReadBuffer(FSize, SizeOf(FSize));
            //………
            //以此类推
          end;
        104:
          begin
            //...
          end;
      end;
      

  2.   

    额,问个很弱智的问题,在 AThread.Connection.ReadStream(FStream,sizeof(  ))这里是大小,我怎么办?我也不知道到底有多大,有图片的时候就大,没图片的时候就小 . 咋办版主?
      

  3.   

    顺便说一句我用的是 indy的TIdTCPServer 。如果对方没有提前告诉我,下面发过来的东西有多大,我该怎么办呢?能TIdTCPServer本身能获得这个包的总大小吗?