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