=============
定义数据包:
unit unit3;interface
type
    p_head=(filelist,server_filelist,filelist_over);
    cmd_page=packed record
    cmd:p_head;
    end;
    file_page=packed record
    head:p_head;
    size:integer;
    body:array[0..2000] of byte;
    end;
implementationend.
=============
控制端:
unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, StdCtrls, IdBaseComponent, IdComponent, IdUDPBase, IdSocketHandle,
  IdUDPServer;type
    TForm1 = class(TForm)
    IdUDPServer1: TIdUDPServer;
    Memo1: TMemo;
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    Label1: TLabel;
    Edit1: TEdit;
    Button1: TButton;
    procedure N1Click(Sender: TObject);
    procedure N2Click(Sender: TObject);
    procedure IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
      ABinding: TIdSocketHandle);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    ip:string;
  end;var
  Form1: TForm1;
  liststream:Tmemorystream;
implementationuses Unit2,unit3;
{$R *.dfm}procedure TForm1.N1Click(Sender: TObject);
begin
form2.Show;
end;procedure TForm1.N2Click(Sender: TObject);
var  cmd:cmd_page;
begin
cmd.cmd:=filelist;
idudpserver1.SendBuffer(ip,8002,cmd,sizeof(cmd));
end;procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
  ABinding: TIdSocketHandle);
var buff:array[0..2050] of byte;
    head:p_head;
    list:tstringlist;
    i:integer;
    filelist:^file_page;
    stream:tstream;
    str:string;
begin
  adata.Read(buff,sizeof(adata.Size));
  label1.Caption:=inttostr(adata.Size);
  filelist:=@buff[0];
  case filelist.head of
  server_filelist: //文件列表
  begin
   liststream.Seek(0,2);
   liststream.WriteBuffer(filelist.body,filelist.size);
  end;
  filelist_over://
  begin  liststream.Position:=0;
  list:=tstringlist.Create;
  list.LoadFromStream(liststream);
  liststream.SaveToFile('1.txt');  {for i:=0 to list.Count-1 do
  begin
  memo1.Lines.Add(list.Strings[i]);
  end;  }
  list.Free;
  liststream.Clear;
  end;
  end;
end;procedure TForm1.FormCreate(Sender: TObject);
begin
   liststream:=tmemorystream.Create;
end;end.
=========================
服务端:
unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdBaseComponent, IdComponent, IdUDPBase, IdUDPServer, StdCtrls,IdSocketHandle;type
  TForm1 = class(TForm)
    IdUDPServer1: TIdUDPServer;
    Label1: TLabel;
    procedure IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
      ABinding: TIdSocketHandle);
  private
    { Private declarations }
  public
    { Public declarations }
  end;var
  Form1: TForm1;
  ip:string;
  i:integer;
implementation
uses unit3;
{$R *.dfm}procedure findfile(path:string;list:tstringlist);
var h:thandle;
    att:TWIN32FindData;
    filename:string;
begin
if path[length(path)]<>'\' then path:=path+'\';
path:=path+'*.*';
h:=windows.FindFirstFile(pchar(path),att);
while h<>INVALID_HANDLE_VALUE do
begin
    filename:=att.cFileName;
    if (filename<>'.') and (filename<>'..') and (att.dwFileAttributes=FILE_ATTRIBUTE_DIRECTORY) then
    begin
        findfile(sysutils.ExtractFilePath(path)+filename,list);   //目录
    end
    else  if (filename<>'.') and (filename<>'..') and (att.dwFileAttributes<>FILE_ATTRIBUTE_DIRECTORY) then
    begin
        //文件
        list.Add(sysutils.ExtractFilePath(path)+filename) ;
    end;
    if not windows.FindNextFile(h,att) then h:= INVALID_HANDLE_VALUE;//该目录下文件及目录已经遍历完毕;
end;
end;procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
  ABinding: TIdSocketHandle);
  var buff:array[0..2050] of byte;
      cmd:p_head;
      list:tstringlist;
      liststream:Tmemorystream;
      posi,sendsize:integer;
      file_trans:file_page;
begin
  ip:=abinding.PeerIP;
  adata.Read(buff,sizeof(adata.Size));  move(buff,cmd,sizeof(cmd));//读取包头;
  case cmd of
  filelist: //文件列表
  begin
     list:=tstringlist.Create;
     liststream:=Tmemorystream.Create;
     findfile('D:\',list);
     list.SaveToStream(liststream);
     liststream.SaveToFile('1.txt');
     posi:=0;
     while posi<liststream.Size do
     begin
      sendsize:=2000;
      if sendsize>liststream.Size then sendsize:=liststream.Size;
      file_trans.head:=server_filelist;
      liststream.Read(file_trans.body,sendsize);
      file_trans.size:= sendsize;
      idudpserver1.SendBuffer(IP,8001,file_trans,sizeof(file_trans));      posi:=posi+sendsize;
     end;     label1.Caption:=inttostr(sizeof(file_trans));
     file_trans.head:=filelist_over;
     idudpserver1.SendBuffer(IP,8001,file_trans,sizeof(file_trans));
     list.Free;
  end;
  end;
end;end.
为什么保存的文件是乱码呢?程序如何改啊,请指点?