Menu
Strona g艂贸wna
Hacking
Programowanie
Telefonia Kom贸rkowa
Kody do Gier
Linux
Dlaczego?
Programowanie w Delphi
Mapa strony
 Programy
Systemy
Artyku艂y PDF

Security

Skanery
Sniffery
Security

Windows

U偶ytkowe
Przegl卤darki graficzne
Kodeki
Narz臋dzia plikowe
Narz臋dzia dyskowe
Narz臋dzia systemowe
Sterowniki
Szyfrowanie danych
Zarz卤dzanie has艂ami
Zarz卤dzanie rejestrem
拢aty i Patche
Zarz卤dzanie pami臋ci卤
Synchronizacja czasu
Nagrywanie p艂yt
Free Antivirus (Darmowe Antyvirusy)
Sterowniki
Obr贸bka d录wi臋ku
Edycja wideo

Internetowe

Bezpiecze帽stwo
Programy P2P
Komunikatory
Dodatki do przegl卤darek
Klienty poczty elektronicznej
Narz臋dzia Antyspamowe
Przegl卤darki grup dyskusyjnych
Przegl卤darki Offline
Serwery poczty elektronicznej
Telefonia kom贸rkowa
Wyszukiwarki internetowe
Zdalny dost臋p
Cybernianie
Klienty FTP
Narz臋dzia internetowe
Prywatno艣c
Przegl卤darki internetowe
Serwery FTP
Serwery WWW
Wspomagacze 艣ci卤gania
Zarz卤dzanie sieci卤 lokaln卤

Tuning Systemu

Diagnostyka i testowanie
Inne
Rozszerzenia pulpitu
Tapety na pulpit
Tuning Systemu
Ikony
Pow艂oki
Tuning sprz臋tu
Wygaszacze ekranu

Programowanie

Kompilatory
Biblioteki i komponenty
Bazy danych
Edytory programistyczne
娄rodowiska programistyczne
Debugery
Tworzenie wersji instalacyjnych

Webmastering

U偶ytkowe
Kursy

Linux

U偶ytkowe
Internetowe
Multimedialne

Programy biurowe

Programy dla firm
Pakiety biurowe
Administracja
Edytory tekstu
Grafika prezentacyjna
Kadry i p艂ace
Wspomaganie projektowania
Zarz卤dzanie projektami
Bazy danych
Finanse i ksi臋gowo艣c
Handel
Programy ewidencyjne
Zarz卤dzanie informacj卤 osobist卤 (PIM)
 Download GRY
Pelne Wersje GIER
 Artyku硑 > Programowanie w Delphi > Wprowadzanie Serwera FTP

Wprowadzanie Serwera FTP

W poprzednim artykule, dyskutowali艣my RFC 959, kt贸ry definiuje jak serwer FTP powinien pracowa膰. Te偶 szli艣my przez troch臋 rozkaz贸w, kt贸re s膮 u偶yte w tym protokole. W tym artykule, b臋dziemy tworzyli przyk艂adowy serwer FTP w Delphi.

Nakaza艂y Narz臋dzia

Delphi 6 albo wy偶szy i Indy 10.1.5, najnowsza migawka. Tylko przetestowa艂em to podanie na XP Windows, tak, chocia偶 nie my艣l臋, 偶e spotkasz jakich艣 problem贸w na innych platform wi臋kszo艣ci, prosz臋 da膰 mi zna膰, czy robisz. Spr贸buj臋 zrobi膰 podanie jako agnostyk platformy jako mo偶liwy.

Podanie

Aby utworzy膰 nasz serwer FTP, b臋dziemy u偶ywali komponentu idftpserver uchwytnego w Delphi. Ten komponent wprowadza w 偶ycie wszystkie rozkazy potrzebowane utworzy膰 wykonalne podanie serwera. Jako zawsze, b臋d臋 wprowadza艂 jako wiele rozkaz贸w jak mo偶liwe w tym podaniu, ale absolutnie nie wszystko oni. Aby wprowadzi膰 w 偶ycie podanie serwera FTP, kt贸re spotyka minimalne wymagania, do kt贸rych potrzebujesz:

* B膮d录 w stanie, by pokaza膰 wszystkie pliki w danym katalogu.

* Zmiana i usu艅 katalog.

* Za艂aduj si臋 i pobierz pliki.

* Usu艅 i ogl膮dnij szczeg贸艂y pliku.

* Po艣wiadcz u偶ytkownika.

Jest du偶o wi臋cej rozkaz贸w, ale mo偶esz tylko oko艂o dosta膰 si臋 na z wprowadzaniem w 偶ycie minimum. Aby widzie膰 jak wiele rozkaz贸w mo偶esz wprowadzi膰 z Indy, upu艣ci膰 komponent idftpserver na formie i patrze膰 na wydarzenia inspektor贸w przedmiotu tab. Indy zrobi艂 wi臋kszo艣膰 interpretowania protoko艂u FTP i w ten spos贸b zrobi艂 to 艂atwe, by wprowadzi膰 w 偶ycie rozkazy.

Zacznij Delphi i utw贸rz nowe podanie. Na formie dodaj膮 posz艂y za komponentami:

* Jedna Notatka s艂u偶bowa

* Trzech Poprawki

* Dwa Przyciski

* Cztery Etykiety

W edit1 's tekst w艂asno艣ci dodaje "myusername" i na edit2 's tekst w艂asno艣ci dodaj膮 "mypassword." Wtedy z kropli tabulatora serwer贸w Indy komponent idFTPServer i od Indy przejmuje kropl臋 tabulatora komponent TidServerInterceptlogfile; przemianuj to do logfile1. Teraz potrzebujemy 艂膮czy膰 to przejmuj膮 do komponentu idftpserver. Tak klik na komponencie idftpserver, p贸jd录 do jego przejmuj膮 w艂asno艣膰 na inspektorze przedmiotu i klikaj膮 na kropli strza艂ka dolna. To powinno zawrze膰 s艂owo "logfile1." Wybierz to i jeste艣my zrobieni.

Na button1 dodaj膮 nag艂贸wek "S膮 cz艂owiekiem sukcesu" i na button2 dodaj膮 nag艂贸wek "Wyj艣cie." Podw贸jne klikn膮膰 na button1 i dodaj posz艂y za kodem:

Button1 robi kilka rzeczy. To aktywuje si臋 jak r贸wnie偶 podania ftpserver ustawia domy艣lny portu, kt贸ry numer jest 21. numer portu jest bardzo wa偶ny, poniewa偶 to jest, gdzie aplikacja u偶ytkownika b臋dzie pr贸bowa艂a by膰 cz艂owiekiem sukcesu do serwera. Button2 tylko zamyka podanie. Twoja forma powinna teraz spojrzenie co艣 podobnego do tego:

procedure TForm1.Button1Click(Sender: TObject); begin idftpserver1.DefaultPort:=strtoint(edit3.text); idftpserver1.Active:=true; showmessage('Connected'); end;

Then聽 do 聽the 聽same聽 for聽 button2聽 but add聽 the聽 following聽 code :

procedure TForm1.Button2Click(Sender: TObject); begin idftpserver1.Active:=false; close; end;

Wprowadzanie Serwera FTP - Kod

Teraz, 偶e GUI jest zrobiony, przejd录my do kodu. Wi臋kszo艣膰 procedur poni偶ej daje tobie wskaz贸wk臋, je艣li chodzi o co kod jest wszystek oko艂o. Skomentowa艂em wi臋kszo艣膰 kodu, 偶eby to, kt贸re mo偶esz 艂atwo pracowa膰 z czym sz艂o dalej w szczeg贸lnej procedurze.

Funkcja setslashes zast臋puje podw贸jnego backslashes z pojedynczym jak r贸wnie偶 backslashes zast臋puje pojedynczego frontslash z backslash. To ma upewni膰 si臋, 偶e jakie艣 nazwy 艣cie偶ki, kt贸re s膮 wys艂ane przez podanie klienta FTP s膮 przetworzone w poprawnym rozkazie. Na przyk艂ad je偶eli u偶ytkownik dostarcza nazw臋 艣cie偶ki jak "c:afilename" wtedy ta funkcja poprawi to, by "c:afilename," kt贸ry poprawna droga jest, by poradzi膰 nazwy 艣cie偶ki.

function setSlashes(APath:String):String;
var
slash:string;
begin
slash := StringReplace(APath, '/', '', [rfReplaceAll]);
slash := StringReplace(slash, '', '', [rfReplaceAll]);
Result :=聽 slash;
end;

Wydarzenie poni偶ej zostaje strzelany kiedy podanie klienta FTP jest cz艂owiekiem sukcesu do serwera. Mo偶esz u偶y膰 tego wydarzenia, by wy艣ledzi膰 co szczeg贸lny klient robi. Na przyk艂ad mo偶esz dosta膰 adresu IP, z kt贸rego klient by艂 cz艂owiekiem sukcesu i czas, kt贸ry klient by艂 cz艂owiekiem sukcesu. Wydarzenie jest ca艂kowicie opcjonalne.

procedure TForm1.IdFTPServer1Connect(AContext: TIdContext);
begin
//Here you could take the client IP address, time that a particular  
//client logged in etc, for tracking purposes
end;

Sznur Vdirectory zawiera katalogu, do kt贸rego potrzebujesz zmieni膰. Directory imi臋 jest wys艂ane przez podanie klienta FTP.:

procedure TForm1.IdFTPServer1ChangeDirectory(ASender:
TIdFTPServerContext; var VDirectory: String); begin
ASender.CurrentDir:= VDirectory; end;
###

Wprowadzanie Serwera FTP - Usuwaj膮c Pliki

Klient wysy艂a imi臋 pliku, by zosta膰 usuni臋ty w zmiennej APathName. Procedura poni偶ej zasadniczo bierze, 偶e nazwa 艣cie偶ki i sprawdza, by zobaczy膰, czy plik istnieje przed usuwaniem tego.

procedure TForm1.IdFTPServer1DeleteFile(ASender:TIdFTPServerContext;
const APathName: String);
begin
if fileexists(APathName) then
begin
DeleteFile(APathName);
end;
end;

To wydarzenie zostaje strzelany kiedy klient chce zweryfikowa膰, czy plik istnieje. Procedura u偶ywa pliku istnieje() funkcja, by przeprowadzi膰 pro艣b臋:

procedure TForm1.IdFTPServer1FileExistCheck(ASender:TIdFTPServerContext; const APathName: String; var VExist: Boolean); begin if fileexists(APathName) then begin VExist:=true; end else begin VExist:=False; end; end;

procedure TForm1.IdFTPServer1GetFileDate(ASender: TIdFTPServerContext; const AFilename: String; var VFileDate: TDateTime); var fdate:tdatetime; begin //put the file date in a variable fdate:= FileAge(AFilename); 聽if聽 not (fdate=-1) then聽 begin VFileDate:=fdate; end; end;

U偶ywamy FindNext i funkcji FindFirst, by dosta膰 poproszon膮 wielko艣膰 pliku jako pod:

procedure TForm1.IdFTPServer1GetFileSize(ASender:TIdFTPServerContext; 聽 const AFilename: String; var VFileSize: Int64); 聽 Var LFile : String; rec:tsearchrec; ASize: Int64 ; 聽 begin LFile := setslashes(homedir + AFilename ); try if FindFirst(Lfile, faAnyFile, rec) = 0 then 聽repeat 聽聽聽聽聽聽聽聽聽聽聽聽 Asize:=rec.Size; 聽聽聽聽聽聽聽聽聽聽聽聽 until FindNext(rec) <> 0; 聽聽聽聽聽聽聽 finally 聽聽聽聽聽聽聽聽聽聽聽 FindClose(rec); end; if Asize > 1 then VFileSize:= Asize else VFilesize:=0; end;

Wprowadzanie Serwera FTP - Sporz膮dzaj膮c list臋 Pliki

To jest by膰 mo偶e najwa偶niejsz膮 procedur膮 ze wszystkich. To wydarzenie sporz膮dza list臋 wszystkie pliki w danym katalogu. To jest st膮d, 偶e mo偶esz zmanipulowa膰 wszystkimi plikami na systemie pliku. Tak st膮pnijmy ostro偶nie przez kod.

Pierwsza rzecz, 偶e robimy jest u偶yciem FindFirst / FindNext funkcje, by przebiec przez jakie艣 pliki, kt贸ry mog膮 by膰 w katalogu. Wi臋c u偶ywamy 艣cie偶ki, kt贸r膮 klient wys艂a艂, kt贸ry jest wprowadzony do pami臋ci zmienn膮 Apath:

SRI := FindFirst(HomeDir +APath + '*.*', faAnyFile - faHidden - 
faSysFile, SR);

Wtedy, poniewa偶 FindFirst znajduje pliki, u偶ywamy specjalnie utworzonego typu rzeczy listy, by zgromadzi膰 r贸偶ne komponenty plik贸w:

LFTPItem := ADirectoryListing.Add;
聽聽聽LFTPItem.FileName := SR.Name;
聽聽 LFTPItem.Size := SR.Size;
聽聽聽LFTPItem.ModifiedDate := FileDateToDateTime(SR.Time); 

Wtedy sprawdzamy, by zobaczy膰, czy katalog zosta艂 znaleziony i zgromadzi膰 zwi膮zany typ pliku.

if SR.Attr = faDirectory then
聽聽聽聽 LFTPItem.ItemType聽聽 := ditDirectory
else
LFTPItem.ItemType聽聽 := ditFile;
SRI := FindNext(SR);

Wtedy po prostu zamykamy operacj臋 przeszuka膰 pliku i ustawiamy katalog aktualny :

 FindClose(SR);
SetCurrentDir(HomeDir + APath + '..');

procedure TForm1.IdFTPServer1ListDirectory(ASender:TIdFTPServerContext; const APath: String; ADirectoryListing: TIdFTPListOutput;const ACmd, ASwitches: String); var LFTPItem :TIdFTPListItem; SR : TSearchRec; SRI : Integer; begin ADirectoryListing.DirFormat := doUnix; SRI := FindFirst(HomeDir + APath + '*.*',
faAnyFile - faHidden - faSysFile, SR); While SRI = 0 do begin LFTPItem := ADirectoryListing.Add; LFTPItem.FileName := SR.Name; LFTPItem.Size := SR.Size; LFTPItem.ModifiedDate := FileDateToDateTime(SR.Time); if SR.Attr = faDirectory then LFTPItem.ItemType聽聽 := ditDirectory 聽聽 else 聽聽聽 LFTPItem.ItemType聽聽 := ditFile; 聽聽 SRI := FindNext(SR); end; FindClose(SR); SetCurrentDir(HomeDir + APath + '..'); end;

The Implementation of an FTP Server - Making and Removing Directories


The MakeDirectory command enables us to create a new directory on the聽 server side. The event below does that by using Delphi's CreateDir function:

procedure TForm1.IdFTPServer1MakeDirectory(ASender:TIdFTPServerContext;
var VDirectory: String);
var
ldir:string;
begin
ldir:= setslashes(Homedir+VDirectory);
if not DirectoryExists(ldir) then
if not CreateDir(ldir) then
raise Exception.Create('Cannot create '+ldir);
end;

The retrieve file event enables the client to download a file. We use Tstreams to open and read a given file:

procedure TForm1.IdFTPServer1RetrieveFile(ASender:TIdFTPServerContext; const AFileName: String; var VStream: TStream); begin VStream := TFileStream.Create(setSlashes
(HomeDir+AFilename),fmOpenRead); end;

procedure TForm1.IdFTPServer1RenameFile(ASender:TIdFTPServerContext; 聽 const ARenameFromFile, ARenameToFile: String); begin if not Renamefile(ARenameFromFile,ARenameToFile) then begin 聽聽 Raise Exception.Create('Could not rename file'); end; end;

The event below executes when the client requests a directory to be removed. Here we use Delphi's RemoveDir() function to delete a directory:

procedure TForm1.IdFTPServer1RemoveDirectory(ASender:TIdFTPServerContext;
var VDirectory: String);
Var
LFile : String;
begin
LFile := setslashes(homedir + VDirectory);
if directoryexists(LFile) then begin
RemoveDir(LFile);
end
else
begin
Raise Exception.Create('Could not remove directory');
聽  end;
end;

Wprowadzanie Serwera FTP - Po艣wiadczaj膮c U偶ytkownik贸w

To wydarzenie po艣wiadcza u偶ytkownika, kt贸ry pr贸buje u偶y膰 serwera FTP. To jest wskazane, by u偶y膰 bazy danych, by po艣wiadczy膰 szczeg贸lnego u偶ytkownika. W kodzie poni偶ej, u偶y艂em "myusername" i "mypassword" jako nazwa u偶ytkownika i has艂o:

procedure TForm1.IdFTPServer1UserLogin(ASender:TIdFTPServerContext;
const AUsername, APassword: String; var AAuthenticated:Boolean);
begin
if (AUsername = edit1.Text) and (APassword = edit2.Text) then
begin
AAuthenticated:=True
end
else
begin
AAuthenticated := False;
end;
end;

procedure TForm1.IdFTPServer1StoreFile(ASender:TIdFTPServerContext; const AFileName: String; AAppend: Boolean; var VStream:TStream); begin if not Aappend then VStream := TFileStream.Create(AFileName,fmCreate) else 聽聽聽聽聽 VStream := TFileStream.Create(AFileName,fmOpenWrite) end;

procedure TForm1.Button1Click(Sender: TObject); begin idftpserver1.DefaultPort:=strtoint(edit3.text); idftpserver1.Active:=true; showmessage('Connected'); end;

procedure TForm1.IdFTPServer1AfterUserLogin(ASender:TIdFTPServerContext); begin //set home dir here homedir:='c:'; end;

To wydarzenie jest opcjonalne. To umo偶liwia ciebie, by pokaza膰 wiadomo艣膰 kiedy wyj膮tek nast臋puje:

procedure TForm1.IdFTPServer1Exception(AContext: TIdContext;
AException: Exception);
begin
showmessage(AException.Message);
end;

procedure TForm1.Button2Click(Sender: TObject); begin idftpserver1.Active:=false; close; end;

Wydarzenie stanu serwera po prostu pokazuje stan serwera kiedy jest zmiana stanu:

procedure TForm1.IdFTPServer1Status(ASender: TObject; const AStatus: TIdStatus; const AStatusText: String); begin memo1.lines.add(Astatustext); end;

procedure TForm1.IdFTPServer1Stat(ASender:TIdFTPServerContext; AStatusInfo: TStrings); var i:integer; begin for i:= 0 to astatusinfo.Count-1 do begin memo1.Lines.Add(astatusinfo.Strings); end; end;

To wydarzenie zostaje strzelany kiedy serwer pisze dane do klienta. Zawar艂em to g艂贸wnie dla debagowania cel贸w. To zarejestruje wszystkie komunikacje mi臋dzy serwerem i klientem:

procedure TForm1.IdFTPServer1Execute(AContext: TIdContext);
begin
logfile1.DoLogWriteString(AContext.Connection.IOHandler.AllData);
end;

To jest wszystek tam, by wprowadza w 偶ycie roboczy serwer FTP. Poniewa偶 nie jeste艣 zawiadomieniem bez w膮tpienia, nie wprowadzi艂em wszystkiego rozkazy, ale wprowadzi艂em pokrycie wszystko to jest wymagane dla serwera FTP, by zadzia艂a膰 dobrze.

Wniosek

Najlepsza droga, by przetestowa膰 to podanie jest z graficznym klientem FTP takie jak Dreamweaver zamiast telnet. Dla jakiego艣 powodu podanie serwera odmawia straci膰 rozkaz LIST kiedy telnet jest u偶yty. I, poniewa偶 stwierdzi艂em wiele raz贸w przed, nie mo偶esz zrobi膰 niczego z serwerem FTP, kt贸ry nie mo偶e pokaza膰 tobie plik贸w w danym katalogu. Zawiadomi艂em producent贸w Indy o tym problemie i jak dobrze p贸jdzie oni b臋d膮 pracowali nad tym.

DISCLAIMER: Zawarto艣膰 dostarczona w tym artykule nie jest zagwarantowana albo jest gwarantowana przez Producenta Zrzuci艂, Inc. Zawarto艣膰 dostarczona jest przeznaczona dla rozrywki i / albo edukacyjne cele 偶eby wprowadzi膰 do pomys艂贸w klucza czytelnika, poj臋膰 i / albo przegl膮dy wyrob贸w. Jako taki to jest ci膮偶膮ce na czytelniku, by zatrudni膰 prawdziwy 艣wiatow膮 taktyk臋 dla bezpiecze艅stwa i wprowadzania najlepszych praktyk. Jeste艣my nie odpowiedzialny za jakie艣 przecz膮ce konsekwencje, kt贸ry mog膮 by膰 skutkiem wprowadzanie w 偶ycie jak膮艣 informacj臋 zakopan膮 nasze artyku艂y albo podr臋czniki. Je偶eli to jest recenzja sprz臋tu komputerowego, to nie jest polecone, by otworzy膰 i / albo zmodyfikowa膰 tw贸j sprz臋t komputerowy.

komentarz[2] |

Copyright 2006 - 2007 E-comet.info. Wszelkie prawa zastrze縪ne.

programy,artyku硑,gry online,teledyski,filmiki,smieszne reklamy,sterowniki,kodeki,programy,program,download, downloads,security,bramka sms, teledyski,antywirusy,darmowe free program,programy p2p,tapety,programy biurowe,programy dla firm,narz阣zia dyskowe,edytory,gry strategiczne,gry przygodowe,gry sportowe, symulatory, gry rpg,gry karciane, gry zrecznosciowe. Zapraszamy.
0.023 |