unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, IdUDPClient, IdBaseComponent, IdComponent, IdUDPBase, IdUDPServer, ComCtrls, StrUtils, IdSocketHandle, IdAntiFreezeBase, IdAntiFreeze; const PackLen = 1024 * 4; type TForm1 = class(TForm) IdUDPServer1: TIdUDPServer; IdUDPClient1: TIdUDPClient; Button1: TButton; OpenDialog1: TOpenDialog; ProgressBar1: TProgressBar; IdAntiFreeze1: TIdAntiFreeze; Memo1: TMemo; Memo2: TMemo; Memo3: TMemo; procedure Button1Click(Sender: TObject); procedure IdUDPServer1UDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle); procedure FormDestroy(Sender: TObject); private { Private declarations } FFileStream: TFileStream; procedure SendFile; public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var str: string; buf: array[0..99] of char; begin if OpenDialog1.Execute then begin IdUDPServer1.Active := True; FFileStream := TFileStream.Create(OpenDialog1.FileName, fmOpenRead); ProgressBar1.Max := FFileStream.Size; Str := 'F' + leftStr(ExtractFileName(OpenDialog1.FileName) + ' ',50); Str := Str + IntToStr(FFileStream.Size); FillChar(Buf, 100, #0); CopyMemory(@Buf, Pchar(Str), Length(Str)); IdUDPClient1.Host := '192.168.100.243'; IdUDPClient1.Port := 7777; IdUDPClient1.Send(Buf); IdUDPClient1.Active := True; //IdUDPClient1.SendBuffer('192.168.100.243', 7777, Buf, Length(Str)); end; end; procedure TForm1.SendFile; var Buf: array [0..PackLen - 1] of char; LeftSize, SendSize: Integer; str: string; eBuf: array [0..1] of char; begin if not IdUDPClient1.Active then begin IdUDPClient1.Active := True; Memo2.Lines.Add('Active') end; LeftSize := FFileStream.Size - FFileStream.Position; if LeftSize > PackLen then SendSize := PackLen else SendSize := LeftSize; FillChar(Buf, PackLen, #0); //FFileStream.Write(Buf, SendSize); FFileStream.Read(Buf, SendSize); ProgressBar1.Position := FFileStream.Position; IdUDPClient1.SendBuffer(Buf, SendSize); Memo3.Lines.Append('K'); //IdUDPClient1.SendBuffer('192.168.100.243', 7777, Buf, SendSize); Memo1.Lines.Append(IntToStr(SendSize) + ' 【'+ IntToStr(ProgressBar1.Position)+'】【' + IntToStr(FFileStream.Size)); if (SendSize < PackLen) and (SendSize <> 0) then begin FillChar(ebuf, 1, #0); eBuf := 'E'; IdUDPClient1.Send(eBuf); //FFileStream.Position := 0; //IdUDPClient1.SendBuffer('192.168.100.243', 7777, eBuf, SendSize); end; end; procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle); var Buf: array [0..29] of char; begin FillChar(Buf, 30, #0); AData.Read(Buf, AData.Size); Memo3.Lines.Append(Buf); if Buf[0] = 'C' then SendFile else if Buf[0] = 'G' then begin FFileStream.Position := StrToInt(Copy(Buf, 2, AData.Size)); SendFile; end; end; procedure TForm1.FormDestroy(Sender: TObject); begin FFileStream.Free; end; end.