Unit1.~pas
上传用户:wshicoco
上传日期:2009-03-23
资源大小:1150k
文件大小:16k
- unit Unit1;
- interface
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, StdCtrls, ComCtrls, ExtCtrls, IdBaseComponent, IdComponent,
- IdUDPBase, IdUDPServer, IdUDPClient,IdSocketHandle, IdIPWatch;
- type
- TForm1 = class(TForm)
- PageControl1: TPageControl;
- TabSheet1: TTabSheet;
- TabSheet2: TTabSheet;
- apply_button: TButton;
- Label1: TLabel;
- Label2: TLabel;
- Label3: TLabel;
- Label4: TLabel;
- locIP_edit: TEdit;
- locPort_edit: TEdit;
- remoteIP_edit: TEdit;
- remotePort_edit: TEdit;
- read_button: TButton;
- StatusBar: TStatusBar;
- write_button: TButton;
- Timer1: TTimer;
- logmemo: TMemo;
- path_edit: TEdit;
- browse_button: TButton;
- OpenDialog1: TOpenDialog;
- client: TIdUDPServer;
- cancel_button: TButton;
- stop_button: TButton;
- trace_button: TButton;
- IPWatch: TIdIPWatch;
- clear_Button: TButton;
- save_button: TButton;
- procedure FormCreate(Sender: TObject);
- procedure apply_buttonClick(Sender: TObject);
- procedure read_buttonClick(Sender: TObject);
- procedure browse_buttonClick(Sender: TObject);
- procedure write_buttonClick(Sender: TObject);
- procedure clientUDPRead(Sender: TObject; AData: TStream;
- ABinding: TIdSocketHandle);
- procedure cancel_buttonClick(Sender: TObject);
- procedure stop_buttonClick(Sender: TObject);
- procedure Timer1Timer(Sender: TObject);
- procedure trace_buttonClick(Sender: TObject);
- procedure clear_ButtonClick(Sender: TObject);
- procedure save_buttonClick(Sender: TObject);
- private
- { Private declarations }
- public
- { Public declarations }
- end;
- type
- rflip=record
- a1:byte;
- a2:byte;
- end;
- frame=record
- op:word;
- info:array[1..514]of byte;
- end;
- var
- Form1: TForm1;
- remoteIP:string;
- remoteport:integer;
- locport:integer;
- transmode,last:boolean;
- filename:string;
- transFrame,recFrame:frame;
- from_file,to_file:file;
- ack_NO,block_NO:word;
- numwrite,numread:integer;
- require1,require2,trans:boolean;
- reqcount,transcount:longint;
- count:longint;
- starttime:longint;
- timeready,trace,acktran:boolean;
- implementation
- {$R *.dfm}
- function selfinc(a:word):word;
- var
- x:word;
- begin
- x:=a;
- if x=65535 then selfinc:=0
- else begin
- x:=x+1;
- selfinc:=x;
- end;
- end;
- function flipout(orig:word):rflip;
- var
- a:byte;
- s:rflip;
- begin
- s:=rflip(orig);
- a:=s.a1;
- s.a1:=s.a2;
- s.a2:=a;
- flipout:=s;
- end;
- function flipin(a1,a2:byte):word;
- var
- a:rflip;
- begin
- a.a1:=a2;
- a.a2:=a1;
- flipin:=word(a);
- end;
- procedure TForm1.FormCreate(Sender: TObject);
- begin
- statusbar.Panels.Items[0].Text:='空闲';
- remoteIP:='127.0.0.1';
- remoteport:=1000;
- locport:=1000;
- opendialog1.InitialDir:=getcurrentdir;
- block_NO:=0;
- ack_NO:=0;
- require1:=false;
- require2:=false;
- trans:=false;
- reqcount:=0;
- transcount:=0;
- timeready:=false;
- trace:=false;
- acktran:=false;
- locIP_edit.Text:=IPWatch.LocalIP;
- end;
- procedure TForm1.apply_buttonClick(Sender: TObject);
- begin
- client.Active:=false;
- locport:=strtoint(locPort_edit.Text);
- remoteIP:=remoteIP_edit.Text;
- remotePort:=strtoint(remotePort_edit.Text);
- write_button.Enabled:=true;
- read_button.Enabled:=true;
- client.DefaultPort:=locport;
- client.Bindings.Add;
- client.Bindings.Items[0].Port:=locport;
- client.Active:=true;
- apply_button.Enabled:=false;
- stop_button.Enabled:=true;
- statusbar.Panels.Items[0].Text:='目标绑定';
- logmemo.Lines.Append(datetostr(date)+' '+timetostr(now));
- logmemo.Lines.Append('绑定远程目标:'+remoteIP+'端口 '+inttostr(remoteport));
- end;
- procedure TForm1.read_buttonClick(Sender: TObject);
- begin
- stop_button.Enabled:=false;
- read_button.Enabled:=false;
- write_button.Enabled:=false;
- browse_button.Enabled:=true;
- cancel_button.Enabled:=true;
- browse_button.Caption:='确定';
- path_edit.Enabled:=true;
- transmode:=true;
- end;
- procedure TForm1.browse_buttonClick(Sender: TObject);
- var
- i,j:integer;
- const
- mode='octet';
- begin
- if transmode then
- begin
- starttime:=0;
- timeready:=true;
- count:=0;
- browse_button.Enabled:=false;
- cancel_button.Enabled:=false;
- filename:=path_edit.Text;
- transframe.op:=word(flipout(1));
- for i:=1 to length(filename) do
- transframe.info[i]:=ord(filename[i]);
- transframe.info[length(filename)+1]:=0;
- for j:=length(filename)+2 to length(filename)+7 do
- transframe.info[j]:=ord(mode[j-length(filename)-1]);
- transframe.info[length(filename)+7]:=0;
- client.SendBuffer(remoteIP,remotePort,transframe,length(filename)+9);
- filename:=getcurrentdir+''+filename;
- assignfile(to_file,filename);
- rewrite(to_file,1);
- require1:=true;
- reqcount:=0;
- statusbar.Panels.Items[0].Text:='读文件请求';
- logmemo.Lines.Append(datetostr(date)+' '+timetostr(now));
- logmemo.Lines.Append('RRQ to '+remoteIP);
- logmemo.text:=logmemo.Text+'01';
- for i:=1 to 514 do
- if transframe.info[i]<>0 then
- logmemo.text:=logmemo.Text+(chr(transframe.info[i]))
- else break;
- logmemo.Text:=logmemo.Text+'0octet0';
- end
- else begin
- if opendialog1.Execute then
- begin
- starttime:=0;
- timeready:=true;
- browse_button.Enabled:=false;
- cancel_button.Enabled:=false;
- filename:=opendialog1.FileName;
- path_edit.Text:=filename;
- for i:=length(fileName) downto 1 do
- if fileName[i]='' then
- break;
- j:=1;
- while i<length(filename) do
- begin
- transframe.info[j]:=ord(filename[i+1]);
- i:=i+1;
- j:=j+1;
- end;
- transframe.info[j]:=0;
- for i:=j+1 to j+6 do
- transframe.info[i]:=ord(mode[i-j]);
- transframe.info[j+6]:=0;
- transframe.op:=word(flipout(2));
- client.SendBuffer(remoteIP,remotePort,transframe,j+8);
- assignfile(from_file,filename);
- reset(from_file,1);
- last:=false;
- require2:=true;
- reqcount:=0;
- statusbar.Panels.Items[0].Text:='写文件请求';
- count:=0;
- logmemo.Lines.Append(datetostr(date)+' '+timetostr(now));
- logmemo.Lines.Append('WRQ to '+remoteIP);
- logmemo.text:=logmemo.Text+'02';
- for i:=1 to 514 do
- if transframe.info[i]<>0 then
- logmemo.text:=logmemo.Text+(chr(transframe.info[i]))
- else break;
- logmemo.Text:=logmemo.Text+'0octet0';
- end;
- end;
- end;
- procedure TForm1.write_buttonClick(Sender: TObject);
- begin
- stop_button.Enabled:=false;
- read_button.Enabled:=false;
- write_button.Enabled:=false;
- browse_button.Enabled:=true;
- cancel_button.Enabled:=true;
- browse_button.Caption:='本地浏览';
- path_edit.Enabled:=false;
- transmode:=false;
-
- end;
- procedure TForm1.clientUDPRead(Sender: TObject; AData: TStream;
- ABinding: TIdSocketHandle);
- var
- i:integer;
- temp:array[1..512] of byte;
- begin
- adata.ReadBuffer(recframe,adata.Size);
- case word(flipout(recframe.op)) of
- 3:begin
- if (flipin(recframe.info[1],recframe.info[2])=selfinc(ack_NO)) then
- begin
- statusbar.Panels.Items[0].Text:='接收文件';
- require1:=false;
- acktran:=false;
- for i:=1 to adata.Size-4 do
- temp[i]:=recframe.info[i+2];
- blockwrite(to_file,temp,adata.size-4,numwrite);
- count:=count+numwrite;
- if trace then begin
- logmemo.Lines.Append(datetostr(date)+' '+timetostr(now));
- logmemo.Lines.Append('Data to local ');
- logmemo.text:=logmemo.Text+'03'+inttostr(recframe.info[1])+inttostr(recframe.info[2]);
- logmemo.Text:=logmemo.Text+' 信息长度 '+inttostr(numwrite)+' byte';
- end;
- ack_NO:=ack_NO+1;
- transframe.op:=word(flipout(4));
- transframe.info[1]:=flipout(ack_NO).a1;
- transframe.info[2]:=flipout(ack_NO).a2;
- client.SendBuffer(remoteIP,remotePort,transframe,4);
- acktran:=true;
- reqcount:=0;
- if trace then begin
- logmemo.Lines.Append(datetostr(date)+' '+timetostr(now));
- logmemo.Lines.Append('ACK to '+remoteIP+' ');
- logmemo.text:=logmemo.Text+'04'+inttostr(transframe.info[1])+inttostr(transframe.info[2]);
- end;
- if numwrite<512 then
- begin
- closefile(to_file);
- numwrite:=0;
- ack_NO:=0;
- read_button.Enabled:=true;
- write_button.Enabled:=true;
- stop_button.Enabled:=true;
- path_edit.Enabled:=false;
- statusbar.Panels.Items[0].Text:='接收完毕';
- logmemo.Lines.Append('文件接受完毕');
- timeready:=false;
- acktran:=false;
- end;
- end;
- end;
- 4:begin
- if (flipin(recframe.info[1],recframe.info[2])=block_NO) then
- begin
- trans:=false;
- if last then block_NO:=0
- else begin
- if trace then begin
- logmemo.Lines.Append(datetostr(date)+' '+timetostr(now));
- logmemo.Lines.Append('ACK to local ');
- logmemo.text:=logmemo.Text+'04'+inttostr(recframe.info[1])+inttostr(recframe.info[2]);
- end;
- statusbar.Panels.Items[0].Text:='发送文件';
- require2:=false;
- block_NO:=block_NO+1;
- blockread(from_file,temp,512,numread);
- transframe.op:=word(flipout(3));
- transframe.info[1]:=flipout(block_NO).a1;
- transframe.info[2]:=flipout(block_NO).a2;
- for i:=3 to numread+2 do
- transframe.info[i]:=temp[i-2];
- client.SendBuffer(remoteIP,remotePort,transframe,numread+4);
- trans:=true;
- reqcount:=0;
- if trace then begin
- logmemo.Lines.Append(datetostr(date)+' '+timetostr(now));
- logmemo.Lines.Append('Data to '+remoteIP+' ');
- logmemo.text:=logmemo.Text+'03'+inttostr(transframe.info[1])+inttostr(transframe.info[2]);
- logmemo.Text:=logmemo.Text+' 信息长度 '+inttostr(numread)+' byte';
- end;
- if numread<512 then
- begin
- statusbar.Panels.Items[0].Text:='发送完毕';
- logmemo.Lines.Append('文件发送完毕');
- closefile(from_file);
- last:=true;
- numread:=0;
- cancel_button.Enabled:=true;
- read_button.Enabled:=true;
- write_button.Enabled:=true;
- stop_button.Enabled:=true;
- timeready:=false;
- end;
- count:=count+numread;
- end;
- end;
- end;
- 5:begin
- logmemo.Lines.Append(datetostr(date)+' '+timetostr(now));
- logmemo.Lines.Append('error: code='+inttostr(flipin(recframe.info[1],recframe.info[2])));
- require1:=false;
- case flipin(recframe.info[1],recframe.info[2]) of
- 0:begin
- filename:='';
- for i:=3 to adata.Size-2 do
- filename:=filename+chr(recframe.info[i]);
- showmessage(filename);
- logmemo.Lines.Append(filename);
- end;
- 1: begin
- showmessage('File not found.');
- logmemo.Lines.Append(datetostr(date)+' '+timetostr(now));
- logmemo.Lines.Append('error: code=1');
- logmemo.Lines.Append('File not found');
- end;
- 2:begin
- showmessage('Access violation.');
- logmemo.Lines.Append(datetostr(date)+' '+timetostr(now));
- logmemo.Lines.Append('error: code=1');
- logmemo.Lines.Append('Access violation.');
- end;
- 3: begin
- showmessage('Disk full or allocation exceeded.');
- logmemo.Lines.Append(datetostr(date)+' '+timetostr(now));
- logmemo.Lines.Append('error: code=1');
- logmemo.Lines.Append('Disk full or allocation exceeded.');
- end;
- 4:begin
- showmessage('Illegal TFTP operation.');
- logmemo.Lines.Append(datetostr(date)+' '+timetostr(now));
- logmemo.Lines.Append('error: code=1');
- logmemo.Lines.Append('Illegal TFTP operation.');
- end;
- 5:begin
- showmessage('Unknown transfer ID.');
- logmemo.Lines.Append(datetostr(date)+' '+timetostr(now));
- logmemo.Lines.Append('error: code=1');
- logmemo.Lines.Append('Unknown transfer ID.');
- end;
- 6:begin
- showmessage('File already exists.');
- logmemo.Lines.Append(datetostr(date)+' '+timetostr(now));
- logmemo.Lines.Append('error: code=1');
- logmemo.Lines.Append('File already exists.');
- end;
- 7:begin
- showmessage('No such user.');
- logmemo.Lines.Append(datetostr(date)+' '+timetostr(now));
- logmemo.Lines.Append('error: code=1');
- logmemo.Lines.Append('No such user.');
- end;
- end;
- block_NO:=0;
- ack_NO:=0;
- read_button.Enabled:=true;
- write_button.Enabled:=true;
- cancel_button.Enabled:=true;
- stop_button.Enabled:=true;
- end;
- end;
- end;
- procedure TForm1.cancel_buttonClick(Sender: TObject);
- begin
- statusbar.Panels.Items[0].Text:='空闲';
- browse_button.Enabled:=false;
- cancel_button.Enabled:=false;
- path_edit.Enabled:=false;
- read_button.Enabled:=true;
- write_button.Enabled:=true;
- stop_button.Enabled:=true;;
- end;
- procedure TForm1.stop_buttonClick(Sender: TObject);
- begin
- stop_button.Enabled:=false;
- apply_button.Enabled:=true;
- client.Active:=false;
- client.Bindings.Items[0].Free;
- statusbar.Panels.Items[0].Text:='空闲';
- end;
- procedure TForm1.Timer1Timer(Sender: TObject);
- var
- i:integer;
- v:real;
- begin
- if require1 then
- begin
- reqcount:=reqcount+1;
- for i:=1 to 512 do
- if transframe.info[i]=0 then break;
- client.SendBuffer(remoteIP,remotePort,transframe,i+8);
- if reqcount=5 then
- begin
- showmessage('连接主机超时');
- logmemo.Lines.Append(datetostr(date)+' '+timetostr(now));
- logmemo.Lines.Append('连接主机超时');
- block_NO:=0;
- ack_NO:=0;
- read_button.Enabled:=true;
- write_button.Enabled:=true;
- cancel_button.Enabled:=true;
- stop_button.Enabled:=true;
- require1:=false;
- statusbar.Panels.Items[0].Text:='重置';
- end;
- end;
- if require2 then
- begin
- reqcount:=reqcount+1;
- for i:=1 to 512 do
- if transframe.info[i]=0 then break;
- client.SendBuffer(remoteIP,remotePort,transframe,i+8);
- if reqcount=5 then
- begin
- showmessage('连接主机超时');
- logmemo.Lines.Append(datetostr(date)+' '+timetostr(now));
- logmemo.Lines.Append('连接主机超时');
- statusbar.Panels.Items[0].Text:='重置';
- block_NO:=0;
- ack_NO:=0;
- read_button.Enabled:=true;
- write_button.Enabled:=true;
- cancel_button.Enabled:=true;
- stop_button.Enabled:=true;
- require2:=false;
- end;
- end;
- if trans then
- begin
- reqcount:=reqcount+1;
- if (reqcount mod 3=0) then
- client.SendBuffer(remoteIP,remotePort,transframe,numread+4);
- if reqcount=9 then
- begin
- showmessage('发送文件超时');
- logmemo.Lines.Append(datetostr(date)+' '+timetostr(now));
- logmemo.Lines.Append('发送文件超时');
- block_NO:=0;
- ack_NO:=0;
- read_button.Enabled:=true;
- write_button.Enabled:=true;
- cancel_button.Enabled:=true;
- stop_button.Enabled:=true;
- trans:=false;
- statusbar.Panels.Items[0].Text:='重置';
- timeready:=false;
- end;
- end;
- if acktran then
- begin
- reqcount:=reqcount+1;
- if (reqcount mod 9=0) then
- client.SendBuffer(remoteIP,remotePort,transframe,numread+4);
- if reqcount=20 then
- begin
- showmessage('接收文件超时');
- logmemo.Lines.Append(datetostr(date)+' '+timetostr(now));
- logmemo.Lines.Append('接收文件超时');
- block_NO:=0;
- ack_NO:=0;
- read_button.Enabled:=true;
- write_button.Enabled:=true;
- cancel_button.Enabled:=true;
- stop_button.Enabled:=true;
- trans:=false;
- statusbar.Panels.Items[0].Text:='重置';
- acktran:=false;
- timeready:=false;
- end;
- end;
- if timeready then
- begin
- starttime:=starttime+1;
- if starttime<>0 then
- begin
- v:=count/starttime/1000;
- statusbar.Panels.Items[1].Text:='速度: '+inttostr(trunc(v))+'KB/s';
- end;
- end;
- end;
- procedure TForm1.trace_buttonClick(Sender: TObject);
- begin
- if not trace then
- begin
- trace:=true;
- trace_button.Caption:='停止跟踪';
- end
- else begin
- trace:=false;
- trace_button.Caption:='跟踪传输';
- end;
- end;
- procedure TForm1.clear_ButtonClick(Sender: TObject);
- begin
- logmemo.Clear;
- end;
- procedure TForm1.save_buttonClick(Sender: TObject);
- begin
- logmemo.Lines.SaveToFile(getcurrentdir+'/save.txt');
- end;
- end.