socket数据包头、包体如何定义?在用sendbuf传输之前需要如何转换类型?
多谢!!!!!!!!!!!!!!!!!!!!!!!!!!!
在线

解决方案 »

  1.   

    用sendbuf发送record的内容
    例如:TApple = record
            color:TColor;
            weight:Integer;
         end;
    var
      apple:TApple;
    begin
      apple.color := clRed;
      apple.weight:= 12;
      ClientSocket1.Socket.SendBuf(@apple,sizeof(TApple));
    end;
    接收可以用ClientSocket1.Socket.ReveiveBuf(@apple,sizeof(TApple));
      

  2.   

    改 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;