socket数据包头、包体如何定义

改 EmpMessage 结构 ,加上   GRECORDCOUNT :BYTE   一项  
   
  EmpMessage=record  
          ename:string[12];  
          phone:string[20];  
          address:string[100];  
          sendtime:string[30];  
          memberid:string[9];  
          orderid:string[13];  
          computerid:string[8];  
          MerkId:string[2];  
          cardid:string[2];  
          mem:string[255];  
          ReCount:integer;  
          G_Record:array   of   GoodsRec,  
  加上   GRECORDCOUNT :BYTE;           //指定array   of   GoodsRec 的大小  
  -----------------------------------  
  发送时:  
  procedure   sendrecord;  
  var  
  sendem   :EmpMessage;  
  grecorcount:Byte;  
  recordsize:integer;  
  SendStream   :tmemorystream;  
  begin  
      grecorcount:=3;  
      Setlength(sendem.G_record,grecorcount);  
      recordsize:=sizeof(EmpMessage)   +grecorcount*sizeof(GoodsRec);//注意这里!!  
      sendem.grecorcount:=grecorcount;  
      sendem.ename:='test';  
      ......//填完其他的数据  
      sendem.G_record[0].goodsid:='aaaaaaaaaa';  
      sendem.G_record[0].goodsname:='bbbbbbbbb';  
      ......  
      sendem.G_record[grecorcount].goodsid:='fffffff';  
      sendem.G_record[grecorcount].goodsname:='zzzzzzzz';  
   
    SendStream:=Tmemorystream.create;  
    try  
          Sendstream.write(sendem,recordsize);  
          Sendstream.position:=0;  
          clientsocket.sendStream(sendstream);  
  finally  
          Sendstream.free;  
  end;  
  end;                
   
  接收端  
   
  procedure   TForm1.ServerSocket1ClientRead(Sender:   TObject;  
      Socket:   TCustomWinSocket);  
  type   PEmpMessage=^EmpMessage;  
  var  
      EM:EmpMessage;  
      buf:pchar;  
      grecordcount:integer;  
  begin  
      getmem(buf,socket.ReceiveLength);  
  try  
   socket.ReceiveBuf(buf^,socket.ReceiveLength);  
   EM:=PEmpMessage(buf)^;  
   grecordcount:=em.grecordcount;  
   
  ////取出 G_record     数据     ///其他数据省略不写了  
      memo1.lines.add(inttostr(EM.G_Record[0].id));  
      memo1.lines.add(EM.G_Record[0].goodsid);  
      memo1.lines.add(EM.G_Record[0].goodsname);  
      ........  
  finally  
      freemem(buf);  
  end;   
 
posted @ 2009-11-02 14:11  装配中的脑袋  阅读(1568)  评论(0)    收藏  举报