File Transfer Protocol (FTP) klient-serwer apklikacja (RFC 959) zaimplementowana za użyciem C Stream Sockets biblioteki w języku C.
-
Skopijować FTP Manager C folder w główny katalog użytkownika.
-
W terminalu:
~$ cd FTP\ Manager\ C/
~$ make
- Ze strony serwera:
~$ cd ./Server/
~$ ./server <port number>
Serwer zostanie podniesiony z ustawieniem nasłuchiwania połączen na wybranym porcie.
- Ze strony klienta:
~$ cd ./Client/
~$ ./client <IP address of server> <port number>
Jako domylśny IP adres serwera jest używany: 127.0.0.1
-
Dostępne komendy:
ftp>put <filename>
(służy do zaladowania pliku o nazwiefilename
do serwera)ftp>get <filename>
(służy do pobrania pliku o nazwiefilename
z serwera)ftp>ls
(służy do wyswietłenia listy plików z bieżącego folderu na serwerze)ftp>!ls
(służy do wyswietłenia listy plików z bieżącego folderu na kliencie)ftp>cd <directory>
(służy do zmiany bieżącego folderu na serwerze)ftp>!cd <directory>
(służy do zmiany bieżącego folderu na kliencie)ftp>pwd
(służy do wyświetłenia ścieżki do bieżącego folderu na serwerze)ftp>!pwd
(służy do wyświetłenia ścieżki do bieżącego folderu na kliencie)ftp>quit
(służy do zamknięcia FTP sesji na kliencie i zwrotu do macierzynskiego środowiska)
- Można zamknąć serwer za pomocy zwykłego sygnalu
Ctrl + C
w oknie terminalu z uruchomionym serwerem. - Można zamknąć serwer za pomocy wywolania komendy
"quit"
w oknie terminalu z uruchomionym klientem.
- Zaimplementowane są wyłącznie wyżej zaznaczone polecenia.
- Maksymalna liczba jednocześnie zalogowanych clientów nie może przekraczać 8.
- W nazwach ścierzek, które są używane jako bierzący katalog roboczy, nie może zaistnieć żadnych spacji (jest to określono tym, że
cd <directory>
jest zaimplementowana za użyciemchdir(<directory>)
, która nie pozwala na użycie białych symboli). - Komenda
get
przepisywuje istniejący plik, jeżeli taki istnieje w katalogu roboczym klienta. Podobnie,put
komenda przepisywuje istniejący plik, jeżeli taki istnieje w katalogu roboczym serwera.
- Przyjmuje każdą z powyżej opisanych komend. Ponad tego, odpowiada komunikatem o blędzie w przypadku niepoprawnego polecenia:
"An invalid FTP command"
. - Dopasowuje polecenia i wypisywuje odpowiednie dane w terminalu.
- Sprawdzenie konca pliku w przypadku
get
iput
komend jest zaimplementowane za pomocy odwolania w odpowiednim procesie(server/client
) do rozmiaru(czy liczbie bloków) pliku. - Działa w trybie połączeniowym i współbieżnym.
-
server.c
- plik zawierający implementacje strony serweru protokolu FTP:- Tworzy
soket
i dowiązuje jego do portu(określonego jako argument, przy wywolaniu procesu). - Zaczyna nasłuchiwać na sokecie.
- Przyjmuje połączenie od klienta.
- Uzyskuje FTP polecenie od klienta.
- Dopasowuje FTP polecenie i sprawdza jego poprawność. Jeżeli wynika błąd podczas zapytu, wysyła komunikat o tym do klienta.
- Wszystkie polecenia są podawane w terminalu. Są konwerowane do poprawnej postaci i wywolane(klientem/serwerem w zależności od rządania).
- W przypadku uzyskania komendy
get
, sprawdza określony plik i wysyła jego do klienta przez połączenie danych (port danych jest generowany serwerem) w postaci blokowej. - W przypadku uzyskania komendy
put
, uzyskuje określony plik od klienta przez połączenie danych (port danych jest generowany serwerem) w postaci blokowej. - W przypadku uzyskania komendy
ls
, wywolane zostaje poleceniepopen("ls","r")
, zaczym wysyłany spis plikow przez połączenie danych (port danych jest generowany serwerem) w postaci blokowej(lista plików może być dużego rozmiaru). - W przypadku uzyskania komendy
cd <directory>
, wywolane zostaje poleceniechdir(<directory>)
, zaczym zmieniany katalog roboczy serwera. - W przypadku uzyskania komendy
pwd
, wywolane zostaje polecenie_getcwd
, jeżeli serwerem jest maszyna pod systemem Windows, czygetcwd
w przeciwnym przypadku, żeby uzyskać katalog roboczy serwera i nadeśłać jego do klienta. - Zamyka się połączenie z klientem, jeżeli zostało uzyskane polecenie
quit
od klienta. - Czeka na nowe połączenia i powtaża cykliczne opisany proces, dopóki nie zostanie wyłączony.
- Tworzy
-
client.cpp
- plik zawierający implementacje strony klienta protokolu FTP:- Tworzy
soket
i dowiązuje jego do serweru za pomocy IP adresu serweru i portu(określonych jako argumenty, przy wywolaniu procesu). - Dopasowuje FTP polecenie i sprawdza jego poprawność. Jeżeli wynika błąd podczas zapytu, wysyła komunikat o tym do klienta.
- Wszystkie polecenia są podawane w terminalu. Są konwerowane do poprawnej postaci i wywolane(klientem/serwerem w zależności od rządania).
- W przypadku uzyskania komendy
get
, uzyskuje plik przez połączenie danych (port danych jest generowany serwerem) w postaci blokowej. - W przypadku uzyskania komendy
put
, sprawdza określony plik i wysyła jego do serwera przez połączenie danych (port danych jest generowany serwerem) w postaci blokowej. - W przypadku uzyskania komendy
ls
, uzyskuje spis plikow przez połączenie danych (port danych jest generowany serwerem) w postaci blokowej(lista plików może być dużego rozmiaru). - W przypadku uzyskania komendy
!ls
, użyte zostaje poleceniesystem("ls")
, zaczym wypisywany spis plikow z katalogu bierzącego clienta. - W przypadku uzyskania komendy
!cd <directory>
, wywolane zostaje poleceniechdir(<directory>)
, zaczym zmieniany katalog roboczy klienta. - W przypadku uzyskania komendy
pwd
, wywolane zostaje polecenie_getcwd
, jeżeli serwerem jest maszyna pod systemem Windows, czygetcwd
w przeciwnym przypadku, żeby uzyskać katalog roboczy klienta. - Wraca się do macierzynskiego środowiska z klienta, jeżeli użyska polecenie
quit
.
- Tworzy
- Inicjalizacja połączenia:
Strona serwera | Strona klienta |
---|---|
~$./server 9999 Server running...waiting for connections. Received request... Child created for dealing with client requests |
~$./client 127.0.0.1 9999 ftp> |
ls
Strona serwera | Strona klienta |
---|---|
String received from client: ls | ftp>ls server server.c test2 |
!ls
Strona serwera | Strona klienta |
---|---|
String received from client: !ls | ftp>!ls client client.c test |
put
Strona serwera | Strona klienta |
---|---|
String received from client: put test Filename given is: test File download done. |
ftp>put test File upload done. |
get
Strona serwera | Strona klienta |
---|---|
String received from client: get test2 Filename given is: test2 File upload done. |
ftp>get test2 File download done. |
pwd
Strona serwera | Strona klienta |
---|---|
String received from client: pwd | ftp>pwd /home/eouser/FTP\ Manager\ C/Server |
!pwd
Strona serwera | Strona klienta |
---|---|
String received from client: !pwd | ftp>!pwd /Users/napolsky/FTP\ Manager\ C/Client |
cd
Strona serwera | Strona klienta |
---|---|
String received from client: cd ../Client Path given is: ../Client |
ftp>cd ../Client Path given is: ../Client |
!cd
Strona serwera | Strona klienta |
---|---|
String received from client: !cd ../Server Path given is: ../Server |
ftp>!cd ../Server Path given is: ../Server |
quit
Strona serwera | Strona klienta |
---|---|
String received from client: quit The client has quit |
ftp>quit |