type
   tmymsg=record
      name:string;
      age:string;
   end;
//发送var msg:tmymsg;
begin
  msg.name='a' ;
  msg.age='10';  idudpsvr.sendto('XXX.XXX.XXX.XXX',3333,rawtobytes(msg,sizeof(msg));//发送成功
end;//在接收端如何还原为记录类型呢?
procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TBytes;
  ABinding: TIdSocketHandle);
begin
  //  ????
end;

解决方案 »

  1.   

    Delphi默认string是长串,本质是指针。
    所以你那样发送会有问题。
    这样定义:
    type
    tmymsg=record
    name:string[31];
    age:string[3];
    end;
      

  2.   

    参考http://www.delphibbs.com/delphibbs/dispq.asp?lid=3153454
      

  3.   

    或用name: array [0..X] of Char;
      

  4.   

    type
       tmymsg=record
          name:string;
          age:string;
       end;
    定义不对!
    应该
    type
       tmymsg=record
          name:string[250];
          age:string[250];
       end;
      

  5.   

    以下代码D6中测试通过
    procedure TForm1.Button1Click(Sender: TObject);
    var
      msg:tmymsg;
    begin
      msg.name := 'zxy';
      msg.age := '10000';
      idudpsvr.SendBuffer('127.0.0.1',1024,msg,sizeof(msg));//发送成功
    end;
    procedure TForm1.idudpsvrUDPRead(Sender: TObject; AData: TStream;
      ABinding: TIdSocketHandle);
    var
      msg:tmymsg;
    begin
      AData.Read(msg,sizeof(msg));
      showmessage(msg.name);
      showmessage(msg.age);
    end;
      

  6.   

    谢谢楼上的几位。我不知道如何去接收,看它的定义:
    procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TBytes;
      ABinding: TIdSocketHandle);如何把TBYTES类型转为我定义的MSG记录类型呢?
      

  7.   

    不好意思。错了。 Move(AData,msg);
      

  8.   

    谢谢诸位.自己解决了.要使用INDY的涵数.
      

  9.   

    看到zhwei_wen(GoldStone)的结贴真的好遗憾,知道答案也不写出来,我来解释一下吧://消息体定义
    type
        TUser = record
        Id: Integer;
        Ip: String[30];
    end;
    //发送
    procedure TForm1.Button1Click(Sender: TObject);
    var
        user: TUser;
    begin
        user.Id := 1000;
        user.Ip := '192.168.1.8';
        IdUDPClient1.SendBuffer('127.0.0.1', 8888, RawToBytes(user,sizeof(user)));
    end;
    //接收
    procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TBytes;
      ABinding: TIdSocketHandle);
    var
        user: TUser;
    begin
        BytesToRaw(AData, user, SizeOf(TUser));
        ShowMessage(IntToStr(user.Id) + ' ' + user.Ip);
    end;
      

  10.   

    indy10有些版本没有这个函数,实现是:procedure BytesToRaw(const AValue: TIdBytes; var VBuffer; const ASize: Integer);
    begin
      Assert(Length(AValue) >= ASize);
      Move(AValue[0], VBuffer, ASize);
    end;