我接收到的结构数据不对,是在本机上测试的:
结构:
 type
     _UDP_INFO = packed record
    OptionType: integer;
    Datatype:integer;
    //STime:TDateTime;
    Pak_t:integer;
    Pak_num:integer;
    Offset: DWORD;
   end;
TIdUDPClient的发送:
var
 aa,bb: _UDP_INFO  ;
 ms:TMemoryStream;
 tms:TMemoryStream;
 bu:string;
 i:integer;
 a:char;
begin
ZeroMemory(@aa,sizeof(aa));
udpc.BroadcastEnabled :=true;
aa.OptionType :=$A;
//aa.STime :=Now();
aa.Datatype :=1;
aa.Pak_t :=1;
aa.Pak_num :=1;
aa.Offset :=sizeof(aa);
ms:=TMemoryStream.Create;
ms.WriteBuffer(aa,sizeof(aa));
udpc.SendBuffer(ms,ms.Size );
****************************************
TIdUDPServer的接收代码:
procedure TForm1.udpsUDPRead(Sender: TObject; AData: TStream;
  ABinding: TIdSocketHandle);
  var
    strstream:TStringStream;
    a:char;
    b:char;
    bu:string ;
    aa: _UDP_INFO  ;
    ms:TMemoryStream;
    s,i:integer;begin
ZeroMemory(@aa,sizeof(aa));
  ms:=TMemoryStream.Create;
  AData.Seek(0,soFromBeginning);
  ms.CopyFrom(AData,Adata.Size ) ;
  ms.Seek(0,soFromBeginning);
  ms.Read(aa,sizeof(aa) );
  Memo1.Lines.Add('Data Option: '+IntToStr(aa.OptionType ));
 // Memo1.Lines.Add('Data Time: '+FormatDateTime('yyyy-m-d h:n:s',aa.STime ) );
  Memo1.Lines.Add('Data Type : '+IntToStr(aa.Datatype )  );
  Memo1.Lines.Add('Data Pak_t : '+IntToStr(aa.Pak_t  )  );
  Memo1.Lines.Add('Data Pak_num : '+IntToStr(aa.Pak_num  )  );
  Memo1.Lines.Add('Data Pak_Office: '+IntToStr(aa.Offset   )  );现在的问题是:接收到的数据是乱七八糟的..

解决方案 »

  1.   

    问题找到,SendBuf不能发送流,改了就好了,但是,我原来的目的是要发送一个不定长的数据给服务器,数据的结构是这样的:前面是个自定义结构,紧跟者是数据,自 定义结构描述了数据是从哪里开始的,接收方找到开始点,取出来就好了 
      

  2.   

    友情顶帖.熊有空去.net坛找俺啊.呵呵..
      

  3.   

    udpc.SendBuffer(ms,ms.Size );
    是什么,我改
    SendBuffer('127.0.0.1',1501,ms,SizeOf(_UDP_INFO ));
    测试没有问题啊
      

  4.   

    有可能是网络字节序的问题,在网络上传输数值类型需要转换:
    eg.
      send: 
           ......
             sendtempRecord.Age=htonl(20);
           ......
      recv:
           ......
            recvAge=ntohl(sendtempRecord.Age)
           ......
      

  5.   

    楼主这里要改一下再试试:
    aa.Offset :=sizeof(aa);
    ms:=TMemoryStream.Create;
    ms.WriteBuffer(aa,sizeof(aa));
    udpc.SendBuffer(ms,ms.Size );
    ----------------------------------------->
    aa.Offset :=sizeof(aa);
    ms:=TMemoryStream.Create;
    ms.WriteBuffer(aa,sizeof(aa));
    ms.Position:=0;////////////////////////////////////////定位流的指针位置
    udpc.SendBuffer(ms,ms.Size );