Unit1.pas
上传用户:wshicoco
上传日期:2009-03-23
资源大小:1150k
文件大小:14k
源码类别:

Ftp服务器

开发平台:

Delphi

  1. unit Unit1;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5.   Dialogs, StdCtrls, ComCtrls, IdBaseComponent, IdComponent, IdUDPBase,
  6.   IdUDPServer, ExtCtrls, IdSocketHandle, IdIPWatch;
  7. type
  8.   TForm1 = class(TForm)
  9.     Server: TIdUDPServer;
  10.     PageControl1: TPageControl;
  11.     TabSheet1: TTabSheet;
  12.     TabSheet2: TTabSheet;
  13.     locIP_edit: TEdit;
  14.     locPort_edit: TEdit;
  15.     Label1: TLabel;
  16.     Label2: TLabel;
  17.     apply_button: TButton;
  18.     Label3: TLabel;
  19.     path_edit: TEdit;
  20.     dir_button: TButton;
  21.     start_button: TButton;
  22.     logmemo: TMemo;
  23.     Label4: TLabel;
  24.     StatusBar: TStatusBar;
  25.     TabSheet3: TTabSheet;
  26.     Memo2: TMemo;
  27.     Timer1: TTimer;
  28.     link_edit: TEdit;
  29.     Label5: TLabel;
  30.     link_button: TButton;
  31.     IPWatch: TIdIPWatch;
  32.     clear_Button: TButton;
  33.     save_button: TButton;
  34.     procedure FormCreate(Sender: TObject);
  35.     procedure start_buttonClick(Sender: TObject);
  36.     procedure dir_buttonClick(Sender: TObject);
  37.     procedure ServerUDPRead(Sender: TObject; AData: TStream;
  38.       ABinding: TIdSocketHandle);
  39.     procedure apply_buttonClick(Sender: TObject);
  40.     procedure link_buttonClick(Sender: TObject);
  41.     procedure clear_ButtonClick(Sender: TObject);
  42.     procedure save_buttonClick(Sender: TObject);
  43.     procedure Timer1Timer(Sender: TObject);
  44.   private
  45.     { Private declarations }
  46.   public
  47.     { Public declarations }
  48.   end;
  49. type
  50.   frame=record
  51.     op:word;
  52.     info:array[1..514] of byte;
  53.   end;
  54.   frame2=record
  55.     op:word;
  56.     info:array[1..514] of byte;
  57.     len:integer;
  58.   end;
  59.   rflip=record
  60.      a1:byte;
  61.      a2:byte;
  62.   end;
  63.   client_link=record
  64.     use:boolean;
  65.     ip:string;
  66.     port:integer;
  67.     total:longint;
  68.     frame_NO:word;
  69.     filename:string;
  70.   end;
  71. var
  72.   Form1: TForm1;
  73.   globaldir:string;
  74.   locIP: string;
  75.   locPort: integer;
  76.   transframe,recframe:frame;
  77.   linkarray:array[1..20]of client_link;
  78.   maxlink:integer;
  79.   fileary:array[1..20]of file;
  80.   tranary:array[1..20]of boolean;
  81.   lastary:array[1..20]of boolean;
  82.   count:array[1..20]of longint;
  83.   frameary:array[1..20]of frame2;
  84. implementation
  85. {$R *.dfm}
  86. function selfinc(a:word):word;
  87. var
  88.   x:word;
  89. begin
  90.   x:=a;
  91.   if x=65535 then selfinc:=0
  92.   else begin
  93.     x:=x+1;
  94.     selfinc:=x;
  95.   end;
  96. end;
  97. function flipout(orig:word):rflip;
  98. var
  99.   a:byte;
  100.   s:rflip;
  101. begin
  102.   s:=rflip(orig);
  103.   a:=s.a1;
  104.   s.a1:=s.a2;
  105.   s.a2:=a;
  106.   flipout:=s;
  107. end;
  108. function flipin(a1,a2:byte):word;
  109. var
  110.   a:rflip;
  111. begin
  112.   a.a1:=a2;
  113.   a.a2:=a1;
  114.   flipin:=word(a);
  115. end;
  116. procedure TForm1.FormCreate(Sender: TObject);
  117. var
  118.   i:integer;
  119. begin
  120.   path_edit.Text:=getcurrentdir;
  121.   globaldir:=path_edit.Text;
  122.   maxlink:=5;
  123.   locport:=69;
  124.   locIP_edit.Text:=IPWatch.LocalIP;
  125.   for i:=1 to maxlink do
  126.   begin
  127.     tranary[i]:=false;
  128.     lastary[i]:=false;
  129.     linkarray[i].use:=false;
  130.     count[i]:=0;
  131.   end;
  132. end;
  133. procedure TForm1.start_buttonClick(Sender: TObject);
  134. var
  135.   i:integer;
  136. begin
  137.   statusbar.Panels.Items[0].Text:='等待连接';
  138.   logmemo.Lines.Append(datetostr(date)+'   '+timetostr(now));
  139.   logmemo.Lines.Append('server端启动');
  140.   link_button.Enabled:=false;
  141.   apply_button.Enabled:=false;
  142.   dir_button.Enabled:=false;
  143.   start_button.Enabled:=false;  
  144.   server.Active:=false;
  145.   server.DefaultPort:=locPort;
  146.   server.Bindings.Add;
  147.   server.Bindings.Items[0].Port:=locPort;
  148.   server.Active:=true;
  149.   for i:=1 to maxlink do
  150.     linkarray[i].use:=false;
  151. end;
  152. procedure TForm1.dir_buttonClick(Sender: TObject);
  153. begin
  154.   globaldir:=path_edit.Text;
  155. end;
  156. procedure TForm1.ServerUDPRead(Sender: TObject; AData: TStream;
  157.   ABinding: TIdSocketHandle);
  158. var
  159.   numread,numwrite:integer;
  160.   temp:array[1..512] of byte;
  161.   i,j:integer;
  162.   filename:string;
  163. begin
  164.   adata.ReadBuffer(recframe,adata.Size);
  165.   case word(flipout(recframe.op)) of
  166.   1:begin
  167.     filename:='';
  168.     for i:=1 to adata.Size-9 do
  169.       filename:=filename+chr(recframe.info[i]);
  170.     filename:=globaldir+''+filename;
  171.     if fileexists(filename) then
  172.     begin
  173.       for i:=1 to maxlink do
  174.         if not linkarray[i].use then
  175.         begin
  176.           statusbar.Panels.Items[0].Text:='请求读连接';
  177.           logmemo.Lines.Append(datetostr(date)+'   '+timetostr(now));
  178.           logmemo.Lines.Append('用户:  '+abinding.peerIP+'端口:'+
  179.                inttostr(abinding.PeerPort)+'读文件请求'+filename);
  180.           linkarray[i].use:=true;
  181.           linkarray[i].ip:=abinding.PeerIP;
  182.           linkarray[i].port:=abinding.PeerPort;
  183.           linkarray[i].total:=0;
  184.           linkarray[i].frame_NO:=1;
  185.           linkarray[i].filename:=filename;
  186.           assignfile(fileary[i],filename);
  187.           reset(fileary[i],1);
  188.           transframe.op:=word(flipout(3));
  189.           blockread(fileary[i],temp,512,numread);
  190.           linkarray[i].total:=linkarray[i].total+numread;
  191.           transframe.info[1]:=flipout(linkarray[i].frame_NO).a1;
  192.           transframe.info[2]:=flipout(linkarray[i].frame_NO).a2;
  193.           for j:=3 to numread+2 do
  194.             transframe.info[j]:=temp[j-2];
  195.           server.SendBuffer(linkarray[i].IP,linkarray[i].Port,transframe,numread+4);
  196.           frameary[i].op:=transframe.op;
  197.           for j:=1 to numread-2 do
  198.             frameary[i].info[j]:=transframe.info[j];
  199.           frameary[i].len:=numread+4;
  200.           tranary[i]:=true;
  201.           count[i]:=0;
  202.           break;
  203.         end else
  204.         begin
  205.           if i=maxlink then
  206.           begin
  207.             logmemo.Lines.Append(datetostr(date)+'   '+timetostr(now));
  208.             logmemo.Lines.Append('用户:  '+abinding.peerIP+'端口:'+
  209.                inttostr(abinding.PeerPort)+'请求读文件失败:最大连接数限制');
  210.             transframe.op:=word(flipout(5));
  211.             transframe.info[1]:=flipout(0).a1;
  212.             transframe.info[2]:=flipout(0).a2;
  213.             filename:='max linked';
  214.             for j:=3 to 12 do
  215.               transframe.info[j]:=ord(filename[j-2]);
  216.             server.SendBuffer(abinding.PeerIP,abinding.PeerPort,transframe,14);
  217.           end;
  218.         end;
  219.     end
  220.     else begin
  221.       logmemo.Lines.Append(datetostr(date)+'   '+timetostr(now));
  222.       logmemo.Lines.Append('用户:  '+abinding.peerIP+'端口:'+
  223.                inttostr(abinding.PeerPort)+'请求读文件失败:文件不存在'+filename);
  224.       transframe.op:=word(flipout(5));
  225.       transframe.info[1]:=flipout(1).a1;
  226.       transframe.info[2]:=flipout(1).a2;
  227.       filename:='file not found';
  228.       for i:=3 to 16 do
  229.         transframe.info[i]:=ord(filename[i-2]);
  230.       server.SendBuffer(abinding.PeerIP,abinding.PeerPort,transframe,18);
  231.     end;
  232.   end;
  233.   2:begin
  234.     filename:='';
  235.     for i:=1 to adata.Size-9 do
  236.       filename:=filename+chr(recframe.info[i]);
  237.     filename:=globaldir+''+filename;
  238.     if (not fileexists(filename)) then
  239.     begin
  240.       for i:=1 to maxlink do
  241.         if (not linkarray[i].use) then
  242.         begin
  243.           logmemo.Lines.Append(datetostr(date)+'   '+timetostr(now));
  244.           logmemo.Lines.Append('用户:  '+abinding.peerIP+'端口:'+
  245.                inttostr(abinding.PeerPort)+'写文件请求'+filename);
  246.           linkarray[i].use:=true;
  247.           linkarray[i].ip:=abinding.PeerIP;
  248.           linkarray[i].port:=abinding.PeerPort;
  249.           linkarray[i].total:=0;
  250.           linkarray[i].frame_NO:=0;
  251.           linkarray[i].filename:=filename;
  252.           lastary[i]:=false;
  253.           assignfile(fileary[i],filename);
  254.           rewrite(fileary[i],1);
  255.           transframe.op:=word(flipout(4));
  256.           transframe.info[1]:=flipout(linkarray[i].frame_NO).a1;
  257.           transframe.info[2]:=flipout(linkarray[i].frame_NO).a2;
  258.           server.SendBuffer(abinding.PeerIP,abinding.PeerPort,transframe,4);
  259.           frameary[i].op:=transframe.op;
  260.           for j:=1 to 2 do
  261.             frameary[i].info[j]:=transframe.info[j];
  262.           frameary[i].len:=4;
  263.           tranary[i]:=true;
  264.           count[i]:=0;
  265.           break;
  266.         end else
  267.         begin
  268.           if i=maxlink then
  269.           begin
  270.             statusbar.Panels.Items[0].Text:='请求写连接';
  271.             logmemo.Lines.Append(datetostr(date)+'   '+timetostr(now));
  272.             logmemo.Lines.Append('用户:  '+abinding.peerIP+'端口:'+
  273.               inttostr(abinding.PeerPort)+'请求写文件失败:最大连接数限制');
  274.             transframe.op:=word(flipout(5));
  275.             transframe.info[1]:=flipout(0).a1;
  276.             transframe.info[2]:=flipout(0).a2;
  277.             filename:='max linked';
  278.             for j:=3 to 12 do
  279.               transframe.info[j]:=ord(filename[j-2]);
  280.             server.SendBuffer(abinding.PeerIP,abinding.PeerPort,transframe,14);
  281.           end;
  282.         end;
  283.     end
  284.     else begin
  285.       logmemo.Lines.Append(datetostr(date)+'   '+timetostr(now));
  286.       logmemo.Lines.Append('用户:  '+abinding.peerIP+'端口:'+
  287.         inttostr(abinding.PeerPort)+'请求写文件失败:文件已经存在'+filename);
  288.       transframe.op:=word(flipout(5));
  289.       transframe.info[1]:=flipout(0).a1;
  290.       transframe.info[2]:=flipout(0).a2;
  291.       filename:='file already exist';
  292.       for i:=3 to 20 do
  293.         transframe.info[i]:=ord(filename[i-2]);
  294.       server.SendBuffer(abinding.PeerIP,abinding.PeerPort,transframe,22);
  295.     end;
  296.   end;
  297.   3:begin
  298.     for i:=1 to maxlink do
  299.       if((linkarray[i].use)and(linkarray[i].ip=abinding.PeerIP)
  300.          and(linkarray[i].port=abinding.PeerPort)) then  break;
  301.     if (flipin(recframe.info[1],recframe.info[2])=(selfinc(linkarray[i].frame_NO))) then
  302.     begin
  303.       tranary[i]:=false;
  304.       statusbar.Panels.Items[0].Text:='传送中...';
  305.       for j:=1 to adata.Size-4 do
  306.         temp[j]:=recframe.info[j+2];
  307.       blockwrite(fileary[i],temp,adata.size-4,numwrite);
  308.       linkarray[i].total:=linkarray[i].total+numwrite;
  309.       linkarray[i].frame_NO:=linkarray[i].frame_NO+1;
  310.       transframe.op:=word(flipout(4));
  311.       transframe.info[1]:=flipout(linkarray[i].frame_NO).a1;
  312.       transframe.info[2]:=flipout(linkarray[i].frame_NO).a2;
  313.       server.SendBuffer(linkarray[i].ip,linkarray[i].port,transframe,4);
  314.       frameary[i].op:=transframe.op;
  315.       for j:=1 to 2 do
  316.         frameary[i].info[j]:=transframe.info[j];
  317.       frameary[i].len:=4;
  318.       tranary[i]:=true;
  319.       count[i]:=0;
  320.       if numwrite<512 then
  321.       begin
  322.         logmemo.Lines.Append(datetostr(date)+'   '+timetostr(now));
  323.         logmemo.Lines.Append('用户:  '+abinding.peerIP+'端口:'+
  324.           inttostr(abinding.PeerPort)+'文件接收完毕'+linkarray[i].filename);
  325.         closefile(fileary[i]);
  326.         linkarray[i].frame_NO:=0;
  327.         statusbar.Panels.Items[0].Text:='接收完毕';
  328.         linkarray[i].use:=false;
  329.         tranary[i]:=false;
  330.         count[i]:=0;
  331.       end;
  332.     end;
  333.   end;
  334.   4:begin
  335.     for i:=1 to maxlink do
  336.       if((linkarray[i].use)and(linkarray[i].ip=abinding.PeerIP)
  337.          and(linkarray[i].port=abinding.PeerPort)) then  break;
  338.     if (flipin(recframe.info[1],recframe.info[2])=linkarray[i].frame_NO) then
  339.     begin
  340.       tranary[i]:=false;
  341.       if not lastary[i] then
  342.       begin
  343.         linkarray[i].frame_NO:=linkarray[i].frame_NO+1;
  344.         seek(fileary[i],linkarray[i].total);
  345.         blockread(fileary[i],temp,512,numread);
  346.         linkarray[i].total:=linkarray[i].total+numread;
  347.         transframe.op:=word(flipout(3));
  348.         transframe.info[1]:=flipout(linkarray[i].frame_NO).a1;
  349.         transframe.info[2]:=flipout(linkarray[i].frame_NO).a2;
  350.         for j:=3 to numread+2 do
  351.           transframe.info[j]:=temp[j-2];
  352.         server.SendBuffer(linkarray[i].ip,linkarray[i].port,transframe,numread+4);
  353.         statusbar.Panels.Items[0].Text:='传送中...';
  354.         frameary[i].op:=transframe.op;
  355.         for j:=1 to numread-2 do
  356.           frameary[i].info[j]:=transframe.info[j];
  357.         frameary[i].len:=numread+4;
  358.         tranary[i]:=true;
  359.         count[i]:=0;
  360.         if numread<512 then
  361.         begin
  362.           statusbar.Panels.Items[0].Text:='发送完毕';
  363.           logmemo.Lines.Append(datetostr(date)+'   '+timetostr(now));
  364.           logmemo.Lines.Append('用户:  '+abinding.peerIP+'端口:'+
  365.             inttostr(abinding.PeerPort)+'文件发送完毕'+linkarray[i].filename);
  366.           lastary[i]:=true;
  367.           closefile(fileary[i]);
  368.         end;
  369.       end
  370.       else
  371.       begin
  372.         lastary[i]:=false;
  373.         linkarray[i].use:=false;
  374.       end;
  375.     end;
  376.   end;
  377.   else begin
  378.     logmemo.Lines.Append(datetostr(date)+'   '+timetostr(now));
  379.     logmemo.Lines.Append('用户:  '+abinding.peerIP+'端口:'+
  380.     inttostr(abinding.PeerPort)+'错误的操作请求');
  381.       transframe.op:=word(flipout(5));
  382.     transframe.info[1]:=flipout(0).a1;
  383.     transframe.info[2]:=flipout(0).a2;
  384.     filename:='wrong operation';
  385.     for j:=3 to 17 do
  386.       transframe.info[j]:=ord(filename[j-2]);
  387.     server.SendBuffer(abinding.PeerIP,abinding.PeerPort,transframe,19);
  388.   end;
  389.   end;
  390. end;
  391. procedure TForm1.apply_buttonClick(Sender: TObject);
  392. begin
  393.   locport:=strtoint(locport_edit.Text);
  394. end;
  395. procedure TForm1.link_buttonClick(Sender: TObject);
  396. begin
  397.   if ((strtoint(link_edit.Text)>20)or(strtoint(link_edit.Text)<1)) then
  398.   begin
  399.     showmessage('非法设定(max=20,min=1)');
  400.     link_edit.Clear;
  401.   end
  402.   else maxlink:=strtoint(link_edit.Text);
  403. end;
  404. procedure TForm1.clear_ButtonClick(Sender: TObject);
  405. begin
  406.   logmemo.Clear;
  407. end;
  408. procedure TForm1.save_buttonClick(Sender: TObject);
  409. begin
  410.   logmemo.Lines.SaveToFile(getcurrentdir+'/save.txt');
  411. end;
  412. procedure TForm1.Timer1Timer(Sender: TObject);
  413. var
  414.   i:integer;
  415. begin
  416.   for i:=1 to maxlink do
  417.   begin
  418.     if tranary[i] then
  419.     begin
  420.       count[i]:=count[i]+1;
  421.       if count[i] mod 3=0 then
  422.         server.SendBuffer(linkarray[i].ip,linkarray[i].port,frameary[i],frameary[i].len);
  423.       if count[i]=9 then
  424.       begin
  425.         tranary[i]:=false;
  426.         count[i]:=0;
  427.         linkarray[i].use:=false;
  428.         logmemo.Lines.Append(datetostr(date)+'   '+timetostr(time));
  429.         logmemo.Lines.Append('用户: '+linkarray[i].ip+inttostr(linkarray[i].port)
  430.           +'连接超时');
  431.       end;
  432.     end;
  433.   end;
  434. end;
  435. end.