Unit1.pas
上传用户:wshicoco
上传日期:2009-03-23
资源大小:1150k
文件大小:14k
- unit Unit1;
- interface
- uses
- Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
- Dialogs, StdCtrls, ComCtrls, IdBaseComponent, IdComponent, IdUDPBase,
- IdUDPServer, ExtCtrls, IdSocketHandle, IdIPWatch;
- type
- TForm1 = class(TForm)
- Server: TIdUDPServer;
- PageControl1: TPageControl;
- TabSheet1: TTabSheet;
- TabSheet2: TTabSheet;
- locIP_edit: TEdit;
- locPort_edit: TEdit;
- Label1: TLabel;
- Label2: TLabel;
- apply_button: TButton;
- Label3: TLabel;
- path_edit: TEdit;
- dir_button: TButton;
- start_button: TButton;
- logmemo: TMemo;
- Label4: TLabel;
- StatusBar: TStatusBar;
- Timer1: TTimer;
- link_edit: TEdit;
- Label5: TLabel;
- link_button: TButton;
- IPWatch: TIdIPWatch;
- clear_Button: TButton;
- save_button: TButton;
- procedure FormCreate(Sender: TObject);
- procedure start_buttonClick(Sender: TObject);
- procedure dir_buttonClick(Sender: TObject);
- procedure ServerUDPRead(Sender: TObject; AData: TStream;
- ABinding: TIdSocketHandle);
- procedure apply_buttonClick(Sender: TObject);
- procedure link_buttonClick(Sender: TObject);
- procedure clear_ButtonClick(Sender: TObject);
- procedure save_buttonClick(Sender: TObject);
- procedure Timer1Timer(Sender: TObject);
- private
- { Private declarations }
- public
- { Public declarations }
- end;
- type
- frame=record
- op:word;
- info:array[1..514] of byte;
- end;
- frame2=record
- op:word;
- info:array[1..514] of byte;
- len:integer;
- end;
- rflip=record
- a1:byte;
- a2:byte;
- end;
- client_link=record
- use:boolean;
- ip:string;
- port:integer;
- total:longint;
- frame_NO:word;
- filename:string;
- end;
- var
- Form1: TForm1;
- globaldir:string;
- locIP: string;
- locPort: integer;
- transframe,recframe:frame;
- linkarray:array[1..20]of client_link;
- maxlink:integer;
- fileary:array[1..20]of file;
- tranary:array[1..20]of boolean;
- lastary:array[1..20]of boolean;
- count:array[1..20]of longint;
- frameary:array[1..20]of frame2;
- 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);
- var
- i:integer;
- begin
- path_edit.Text:=getcurrentdir;
- globaldir:=path_edit.Text;
- maxlink:=5;
- locport:=69;
- locIP_edit.Text:=IPWatch.LocalIP;
- for i:=1 to maxlink do
- begin
- tranary[i]:=false;
- lastary[i]:=false;
- linkarray[i].use:=false;
- count[i]:=0;
- end;
- end;
- procedure TForm1.start_buttonClick(Sender: TObject);
- var
- i:integer;
- begin
- statusbar.Panels.Items[0].Text:='等待连接';
- logmemo.Lines.Append(datetostr(date)+' '+timetostr(now));
- logmemo.Lines.Append('服务器端启动');
- link_button.Enabled:=false;
- apply_button.Enabled:=false;
- dir_button.Enabled:=false;
- start_button.Enabled:=false;
- server.Active:=false;
- server.DefaultPort:=locPort;
- server.Bindings.Add;
- server.Bindings.Items[0].Port:=locPort;
- server.Active:=true;
- for i:=1 to maxlink do
- linkarray[i].use:=false;
- end;
- procedure TForm1.dir_buttonClick(Sender: TObject);
- begin
- globaldir:=path_edit.Text;
- end;
- procedure TForm1.ServerUDPRead(Sender: TObject; AData: TStream;
- ABinding: TIdSocketHandle);
- var
- numread,numwrite:integer;
- temp:array[1..512] of byte;
- i,j:integer;
- filename:string;
- begin
- adata.ReadBuffer(recframe,adata.Size);
- case word(flipout(recframe.op)) of
- 1:begin
- filename:='';
- for i:=1 to adata.Size-9 do
- filename:=filename+chr(recframe.info[i]);
- filename:=globaldir+''+filename;
- if fileexists(filename) then
- begin
- for i:=1 to maxlink do
- if not linkarray[i].use then
- begin
- statusbar.Panels.Items[0].Text:='请求读连接';
- logmemo.Lines.Append(datetostr(date)+' '+timetostr(now));
- logmemo.Lines.Append('用户: '+abinding.peerIP+'端口:'+
- inttostr(abinding.PeerPort)+'读文件请求'+filename);
- linkarray[i].use:=true;
- linkarray[i].ip:=abinding.PeerIP;
- linkarray[i].port:=abinding.PeerPort;
- linkarray[i].total:=0;
- linkarray[i].frame_NO:=1;
- linkarray[i].filename:=filename;
- assignfile(fileary[i],filename);
- reset(fileary[i],1);
- transframe.op:=word(flipout(3));
- blockread(fileary[i],temp,512,numread);
- linkarray[i].total:=linkarray[i].total+numread;
- transframe.info[1]:=flipout(linkarray[i].frame_NO).a1;
- transframe.info[2]:=flipout(linkarray[i].frame_NO).a2;
- for j:=3 to numread+2 do
- transframe.info[j]:=temp[j-2];
- server.SendBuffer(linkarray[i].IP,linkarray[i].Port,transframe,numread+4);
- frameary[i].op:=transframe.op;
- for j:=1 to numread-2 do
- frameary[i].info[j]:=transframe.info[j];
- frameary[i].len:=numread+4;
- tranary[i]:=true;
- count[i]:=0;
- break;
- end else
- begin
- if i=maxlink then
- begin
- logmemo.Lines.Append(datetostr(date)+' '+timetostr(now));
- logmemo.Lines.Append('用户: '+abinding.peerIP+'端口:'+
- inttostr(abinding.PeerPort)+'请求读文件失败:最大连接数限制');
- transframe.op:=word(flipout(5));
- transframe.info[1]:=flipout(0).a1;
- transframe.info[2]:=flipout(0).a2;
- filename:='max linked';
- for j:=3 to 12 do
- transframe.info[j]:=ord(filename[j-2]);
- server.SendBuffer(abinding.PeerIP,abinding.PeerPort,transframe,14);
- end;
- end;
- end
- else begin
- logmemo.Lines.Append(datetostr(date)+' '+timetostr(now));
- logmemo.Lines.Append('用户: '+abinding.peerIP+'端口:'+
- inttostr(abinding.PeerPort)+'请求读文件失败:文件不存在'+filename);
- transframe.op:=word(flipout(5));
- transframe.info[1]:=flipout(1).a1;
- transframe.info[2]:=flipout(1).a2;
- filename:='file not found';
- for i:=3 to 16 do
- transframe.info[i]:=ord(filename[i-2]);
- server.SendBuffer(abinding.PeerIP,abinding.PeerPort,transframe,18);
- end;
- end;
- 2:begin
- filename:='';
- for i:=1 to adata.Size-9 do
- filename:=filename+chr(recframe.info[i]);
- filename:=globaldir+''+filename;
- if (not fileexists(filename)) then
- begin
- for i:=1 to maxlink do
- if (not linkarray[i].use) then
- begin
- logmemo.Lines.Append(datetostr(date)+' '+timetostr(now));
- logmemo.Lines.Append('用户: '+abinding.peerIP+'端口:'+
- inttostr(abinding.PeerPort)+'写文件请求'+filename);
- linkarray[i].use:=true;
- linkarray[i].ip:=abinding.PeerIP;
- linkarray[i].port:=abinding.PeerPort;
- linkarray[i].total:=0;
- linkarray[i].frame_NO:=0;
- linkarray[i].filename:=filename;
- lastary[i]:=false;
- assignfile(fileary[i],filename);
- rewrite(fileary[i],1);
- transframe.op:=word(flipout(4));
- transframe.info[1]:=flipout(linkarray[i].frame_NO).a1;
- transframe.info[2]:=flipout(linkarray[i].frame_NO).a2;
- server.SendBuffer(abinding.PeerIP,abinding.PeerPort,transframe,4);
- frameary[i].op:=transframe.op;
- for j:=1 to 2 do
- frameary[i].info[j]:=transframe.info[j];
- frameary[i].len:=4;
- tranary[i]:=true;
- count[i]:=0;
- break;
- end else
- begin
- if i=maxlink then
- begin
- statusbar.Panels.Items[0].Text:='请求写连接';
- logmemo.Lines.Append(datetostr(date)+' '+timetostr(now));
- logmemo.Lines.Append('用户: '+abinding.peerIP+'端口:'+
- inttostr(abinding.PeerPort)+'请求写文件失败:最大连接数限制');
- transframe.op:=word(flipout(5));
- transframe.info[1]:=flipout(0).a1;
- transframe.info[2]:=flipout(0).a2;
- filename:='max linked';
- for j:=3 to 12 do
- transframe.info[j]:=ord(filename[j-2]);
- server.SendBuffer(abinding.PeerIP,abinding.PeerPort,transframe,14);
- end;
- end;
- end
- else begin
- logmemo.Lines.Append(datetostr(date)+' '+timetostr(now));
- logmemo.Lines.Append('用户: '+abinding.peerIP+'端口:'+
- inttostr(abinding.PeerPort)+'请求写文件失败:文件已经存在'+filename);
- transframe.op:=word(flipout(5));
- transframe.info[1]:=flipout(0).a1;
- transframe.info[2]:=flipout(0).a2;
- filename:='file already exist';
- for i:=3 to 20 do
- transframe.info[i]:=ord(filename[i-2]);
- server.SendBuffer(abinding.PeerIP,abinding.PeerPort,transframe,22);
- end;
- end;
- 3:begin
- for i:=1 to maxlink do
- if((linkarray[i].use)and(linkarray[i].ip=abinding.PeerIP)
- and(linkarray[i].port=abinding.PeerPort)) then break;
- if (flipin(recframe.info[1],recframe.info[2])=(selfinc(linkarray[i].frame_NO))) then
- begin
- tranary[i]:=false;
- statusbar.Panels.Items[0].Text:='传送中...';
- for j:=1 to adata.Size-4 do
- temp[j]:=recframe.info[j+2];
- blockwrite(fileary[i],temp,adata.size-4,numwrite);
- linkarray[i].total:=linkarray[i].total+numwrite;
- linkarray[i].frame_NO:=linkarray[i].frame_NO+1;
- transframe.op:=word(flipout(4));
- transframe.info[1]:=flipout(linkarray[i].frame_NO).a1;
- transframe.info[2]:=flipout(linkarray[i].frame_NO).a2;
- server.SendBuffer(linkarray[i].ip,linkarray[i].port,transframe,4);
- frameary[i].op:=transframe.op;
- for j:=1 to 2 do
- frameary[i].info[j]:=transframe.info[j];
- frameary[i].len:=4;
- tranary[i]:=true;
- count[i]:=0;
- if numwrite<512 then
- begin
- logmemo.Lines.Append(datetostr(date)+' '+timetostr(now));
- logmemo.Lines.Append('用户: '+abinding.peerIP+'端口:'+
- inttostr(abinding.PeerPort)+'文件接收完毕'+linkarray[i].filename);
- closefile(fileary[i]);
- linkarray[i].frame_NO:=0;
- statusbar.Panels.Items[0].Text:='接收完毕';
- linkarray[i].use:=false;
- tranary[i]:=false;
- count[i]:=0;
- end;
- end;
- end;
- 4:begin
- for i:=1 to maxlink do
- if((linkarray[i].use)and(linkarray[i].ip=abinding.PeerIP)
- and(linkarray[i].port=abinding.PeerPort)) then break;
- if (flipin(recframe.info[1],recframe.info[2])=linkarray[i].frame_NO) then
- begin
- tranary[i]:=false;
- if not lastary[i] then
- begin
- linkarray[i].frame_NO:=linkarray[i].frame_NO+1;
- seek(fileary[i],linkarray[i].total);
- blockread(fileary[i],temp,512,numread);
- linkarray[i].total:=linkarray[i].total+numread;
- transframe.op:=word(flipout(3));
- transframe.info[1]:=flipout(linkarray[i].frame_NO).a1;
- transframe.info[2]:=flipout(linkarray[i].frame_NO).a2;
- for j:=3 to numread+2 do
- transframe.info[j]:=temp[j-2];
- server.SendBuffer(linkarray[i].ip,linkarray[i].port,transframe,numread+4);
- statusbar.Panels.Items[0].Text:='传送中...';
- frameary[i].op:=transframe.op;
- for j:=1 to numread-2 do
- frameary[i].info[j]:=transframe.info[j];
- frameary[i].len:=numread+4;
- tranary[i]:=true;
- count[i]:=0;
- if numread<512 then
- begin
- statusbar.Panels.Items[0].Text:='发送完毕';
- logmemo.Lines.Append(datetostr(date)+' '+timetostr(now));
- logmemo.Lines.Append('用户: '+abinding.peerIP+'端口:'+
- inttostr(abinding.PeerPort)+'文件发送完毕'+linkarray[i].filename);
- lastary[i]:=true;
- closefile(fileary[i]);
- end;
- end
- else
- begin
- lastary[i]:=false;
- linkarray[i].use:=false;
- end;
- end;
- end;
- else begin
- logmemo.Lines.Append(datetostr(date)+' '+timetostr(now));
- logmemo.Lines.Append('用户: '+abinding.peerIP+'端口:'+
- inttostr(abinding.PeerPort)+'错误的操作请求');
- transframe.op:=word(flipout(5));
- transframe.info[1]:=flipout(0).a1;
- transframe.info[2]:=flipout(0).a2;
- filename:='wrong operation';
- for j:=3 to 17 do
- transframe.info[j]:=ord(filename[j-2]);
- server.SendBuffer(abinding.PeerIP,abinding.PeerPort,transframe,19);
- end;
- end;
- end;
- procedure TForm1.apply_buttonClick(Sender: TObject);
- begin
- locport:=strtoint(locport_edit.Text);
- end;
- procedure TForm1.link_buttonClick(Sender: TObject);
- begin
- if ((strtoint(link_edit.Text)>20)or(strtoint(link_edit.Text)<1)) then
- begin
- showmessage('非法设定(max=20,min=1)');
- link_edit.Clear;
- end
- else maxlink:=strtoint(link_edit.Text);
- 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;
- procedure TForm1.Timer1Timer(Sender: TObject);
- var
- i:integer;
- begin
- for i:=1 to maxlink do
- begin
- if tranary[i] then
- begin
- count[i]:=count[i]+1;
- if count[i] mod 3=0 then
- server.SendBuffer(linkarray[i].ip,linkarray[i].port,frameary[i],frameary[i].len);
- if count[i]=9 then
- begin
- tranary[i]:=false;
- count[i]:=0;
- linkarray[i].use:=false;
- logmemo.Lines.Append(datetostr(date)+' '+timetostr(time));
- logmemo.Lines.Append('用户: '+linkarray[i].ip+inttostr(linkarray[i].port)
- +'连接超时');
- end;
- end;
- end;
- end;
- end.