μ΄ νλ‘μ νΈλ FTP(File Transfer Protocol) μλ²μ ν΄λΌμ΄μΈνΈλ₯Ό C μΈμ΄λ₯Ό μ¬μ©νμ¬ κ΅¬νν μμ€ν νλ‘κ·Έλλ° κ³Όμ μ λλ€. TCP/IP μμΌ νλ‘κ·Έλλ°μ κΈ°λ°μΌλ‘ νλ©°, νμ€ FTP λͺ λ Ήμ΄λ₯Ό μ§μνλ μμ ν FTP μλΉμ€ μμ€ν μ μ 곡ν©λλ€.
μμ±μ: κΉμ€μ
μμ±μΌ: 2024/05/28
μ΄μ체μ : Ubuntu 20.04.06 LTS 64bits
- β μλ² μ°κ²° λ° μ¬μ©μ μΈμ¦
- β FTP λͺ λ Ήμ΄ λ³ν (μ¬μ©μ λͺ λ Ή β FTP λͺ λ Ή)
- β
νμΌ λͺ©λ‘ μ‘°ν (
ls,ls -a,ls -l,ls -al) - β
νμ¬ μμ
λλ ν 리 νμΈ (
pwd) - β
λλ ν 리 μ΄λ (
cd,cd ..) - β
λλ ν 리 μμ±/μμ (
mkdir,rmdir) - β
νμΌ μμ (
delete) - β
νμΌ μ΄λ¦ λ³κ²½ (
rename) - β
νμΌ λ€μ΄λ‘λ (
get) - β
νμΌ μ
λ‘λ (
put) - β
μ μ‘ λͺ¨λ μ€μ (
bin,ascii,type binary,type ascii) - β
νλ‘κ·Έλ¨ μ’
λ£ (
quit) - β λ°μ΄ν° μ°κ²°(PORT λͺ¨λ) μλ μμ± λ° κ΄λ¦¬
- β μ μ‘λ νμΌ ν¬κΈ° νμ
- β λμ λ€μ€ ν΄λΌμ΄μΈνΈ μ§μ (Concurrent Server)
- β
IP μ£Όμ κΈ°λ° μ κ·Ό μ μ΄ (
access.txt) - β
μ¬μ©μ μΈμ¦ (
passwdνμΌ κΈ°λ°) - β λ‘κ·ΈμΈ μ€ν¨ 3ν μ ν
- β λͺ¨λ FTP λͺ λ Ήμ΄ μ²λ¦¬ λ° μ€ν
- β λ°μ΄ν° μ°κ²° λΆλ¦¬ (Control/Data Connection)
- β λ°μ΄λ리/ASCII μ μ‘ λͺ¨λ μ§μ
- β νμΌ μμ€ν μ°λ (λλ ν 리 νμ, νμΌ μ‘°μ)
- β KILL μ νΈ(^C) μ²λ¦¬
- μ΄μ체μ : Linux/Unix (Ubuntu 20.04 μ΄μ κΆμ₯)
- μ»΄νμΌλ¬: GCC
- λΌμ΄λΈλ¬λ¦¬: νμ€ C λΌμ΄λΈλ¬λ¦¬
- λ€νΈμν¬: TCP/IP μ§μ
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <dirent.h>
#include <pwd.h>
#include <grp.h>
#include <time.h>Assignment3_3_D_2020202095/
β
βββ cli.c # FTP ν΄λΌμ΄μΈνΈ μμ€ μ½λ
βββ srv.c # FTP μλ² μμ€ μ½λ
βββ Makefile # λΉλ μ€ν¬λ¦½νΈ
βββ access.txt # IP μ κ·Ό μ μ΄ νμΌ
βββ passwd # μ¬μ©μ μΈμ¦ νμΌ
βββ ARCHITECTURE.md # μμ€ν
μν€ν
μ² λ¬Έμ
βββ README.md # νλ‘μ νΈ μ€λͺ
μ (λ³Έ νμΌ)
- FTP ν΄λΌμ΄μΈνΈ νλ‘κ·Έλ¨
- μ¬μ©μ μ λ ₯μ λ°μ FTP λͺ λ ΉμΌλ‘ λ³ννκ³ μλ²λ‘ μ μ‘
- μλ² μλ΅μ μ²λ¦¬νμ¬ κ²°κ³Όλ₯Ό μΆλ ₯
- FTP μλ² νλ‘κ·Έλ¨
- ν΄λΌμ΄μΈνΈ μ°κ²°μ λ°μ μΈμ¦ ν λͺ λ Ή μ²λ¦¬
fork()λ₯Ό μ¬μ©ν λμ λ€μ€ ν΄λΌμ΄μΈνΈ μ§μ
- νμ©ν IP μ£Όμ ν¨ν΄ λͺ©λ‘
- μμΌλμΉ΄λ(
*) μ§μ - μμ:
127.0.0.1 128.134.64.* 203.245.*.*
- μ¬μ©μ μΈμ¦ μ 보 μ μ₯ νμΌ
/etc/passwdνμμΌλ‘ ꡬμ±- μ¬μ©μλͺ κ³Ό λΉλ°λ²νΈ κ²μ¦μ μ¬μ©
# λͺ¨λ νλ‘κ·Έλ¨ λΉλ
make
# λλ κ°λ³ λΉλ
make cli # ν΄λΌμ΄μΈνΈλ§ λΉλ
make srv # μλ²λ§ λΉλλΉλ κ²°κ³Ό:
cli: ν΄λΌμ΄μΈνΈ μ€ν νμΌsrv: μλ² μ€ν νμΌ
make clean # μμ±λ μ€ν νμΌ μμ # κΈ°λ³Έ μ¬μ©λ²
./srv [ν¬νΈλ²νΈ]
# μμ: ν¬νΈ 2121μμ μλ² μ€ν
./srv 2121μλ² μ€ν μ μ£Όμμ¬ν:
- μλ²λ μ§μ λ ν¬νΈμμ λκΈ° μνλ‘ μμλ©λλ€
- ν΄λΌμ΄μΈνΈ μ°κ²°μ κΈ°λ€λ¦½λλ€
- KILL μ νΈ(^C)λ‘ μ’ λ£ν©λλ€
# κΈ°λ³Έ μ¬μ©λ²
./cli [μλ²IP] [ν¬νΈλ²νΈ]
# μμ: λ‘컬 μλ²(ν¬νΈ 2121)μ μ°κ²°
./cli 127.0.0.1 2121ν΄λΌμ΄μΈνΈ μ€ν ν:
- μλ²μμ μ κ·Ό μ μ΄ νμΈ β Welcome λ©μμ§ λλ κ±°λΆ λ©μμ§
- μ¬μ©μλͺ
μ
λ ₯ (
Input ID :) - λΉλ°λ²νΈ μ
λ ₯ (
Input Password :) - λ‘κ·ΈμΈ μ±κ³΅ μ
ftp>ν둬ννΈ νμ - FTP λͺ λ Ήμ΄ μ λ ₯
νμ¬ λλ ν 리μ νμΌ λͺ©λ‘μ κ°λ¨ν νμν©λλ€.
ftp> ls
file1.txt
file2.txt
directory1/μ¨κΉ νμΌμ ν¬ν¨ν λͺ¨λ νμΌμ νμν©λλ€.
ftp> ls -a
./
../
file1.txt
.hidden_fileνμΌμ μμΈ μ 보λ₯Ό νμν©λλ€ (κΆν, μμ μ, ν¬κΈ°, μμ μΌ λ±).
ftp> ls -l
-rw-r--r-- 1 user group 1024 May 28 10:00 file1.txt
drwxr-xr-x 2 user group 4096 May 28 10:01 directory1/μ¨κΉ νμΌμ ν¬ν¨ν μμΈ μ 보λ₯Ό νμν©λλ€.
νμ¬ μμ λλ ν 리μ μ λ κ²½λ‘λ₯Ό νμν©λλ€.
ftp> pwd
257 "/home/user/ftp" is current directoryμ§μ ν λλ ν λ¦¬λ‘ μ΄λν©λλ€.
ftp> cd directory1
250 CWD command suceeds.μμ λλ ν λ¦¬λ‘ μ΄λν©λλ€.
ftp> cd ..
250 CWD command suceeds.μ λλ ν 리λ₯Ό μμ±ν©λλ€.
ftp> mkdir newdir
250 MKD command performed successfully.λΉ λλ ν 리λ₯Ό μμ ν©λλ€.
ftp> rmdir olddir
250 RMD command performed successfully.νμΌμ μμ ν©λλ€.
ftp> delete file.txt
250 DELE command performed succesfullyνμΌ λλ λλ ν 리 μ΄λ¦μ λ³κ²½ν©λλ€.
ftp> rename old.txt new.txt
350 File exists, ready to rename
250 RNTO command succeedsμλ²μμ νμΌμ λ€μ΄λ‘λν©λλ€.
ftp> get file.txt
150 Opening binary mode data connection.
226 Complete transmission.
OK. 1024 bytes is received.ν΄λΌμ΄μΈνΈμμ μλ²λ‘ νμΌμ μ λ‘λν©λλ€.
ftp> put localfile.txt
150 Opening binary mode data connection.
226 Complete transmission.
OK. 2048 bytes sent.λ°μ΄λ리 λͺ¨λλ‘ μ νν©λλ€ (κΈ°λ³Έκ°).
ftp> bin
201 Type set to I.ASCII ν μ€νΈ λͺ¨λλ‘ μ νν©λλ€.
ftp> ascii
201 Type set to A.FTP μΈμ μ μ’ λ£νκ³ ν΄λΌμ΄μΈνΈ νλ‘κ·Έλ¨μ μ’ λ£ν©λλ€.
ftp> quit
221 Goodbye.μ΄ FTP ꡬνμ λΆλ¦¬λ μ°κ²°(Split Connection) λ°©μμ μ¬μ©ν©λλ€:
-
Control Connection (μ μ΄ μ°κ²°)
- ν¬νΈ: μ¬μ©μ μ§μ (μ: 2121)
- μ©λ: FTP λͺ λ Ήμ΄ μ μ‘ λ° μλ΅ μμ
- νλ‘ν μ½: TCP/IP
-
Data Connection (λ°μ΄ν° μ°κ²°)
- ν¬νΈ: λμ μΌλ‘ μμ± (10001~30000 λ²μμ λλ€ ν¬νΈ)
- μ©λ: νμΌ λ°μ΄ν° λ° λλ ν 리 λͺ©λ‘ μ μ‘
- νλ‘ν μ½: TCP/IP
- μμ± λ°©μ: PORT λͺ¨λ (ν΄λΌμ΄μΈνΈκ° μλ²μ ν¬νΈ μ 보 μ 곡)
μλ²λ Concurrent Server λ°©μμΌλ‘ ꡬνλμμ΅λλ€:
fork()μμ€ν μ½μ μ¬μ©νμ¬ κ° ν΄λΌμ΄μΈνΈλ§λ€ λ³λμ μμ νλ‘μΈμ€ μμ±- λΆλͺ¨ νλ‘μΈμ€λ μλ‘μ΄ μ°κ²°μ κ³μ μλ½
- μμ νλ‘μΈμ€λ ν΄λΉ ν΄λΌμ΄μΈνΈμ λͺ λ Ήμ μ²λ¦¬
1. ν΄λΌμ΄μΈνΈ μ°κ²° μμ²
β
2. μλ²: IP μ£Όμ νμΈ (access.txt)
ββ νμ©λ IP β Welcome λ©μμ§ (220)
ββ κ±°λΆλ IP β μ κ·Ό κ±°λΆ λ©μμ§ (431) λ° μ°κ²° μ’
λ£
β
3. ν΄λΌμ΄μΈνΈ: USER [μ¬μ©μλͺ
] μ μ‘
β
4. μλ²: μ¬μ©μλͺ
νμΈ (passwd νμΌ)
ββ μ ν¨ β 331 Password required
ββ λ¬΄ν¨ β 430 Invalid username β μ¬μλ (μ΅λ 3ν)
β
5. ν΄λΌμ΄μΈνΈ: PASS [λΉλ°λ²νΈ] μ μ‘
β
6. μλ²: λΉλ°λ²νΈ νμΈ (passwd νμΌ)
ββ μ ν¨ β 230 User logged in
ββ λ¬΄ν¨ β 430 Invalid password β μ¬μλ (μ΅λ 3ν)
β
7. μΈμ
μμ (fork()λ‘ μμ νλ‘μΈμ€ μμ±)
1. ν΄λΌμ΄μΈνΈ: μ¬μ©μ λͺ
λ Ή μ
λ ₯ (μ: "ls -l")
β
2. ν΄λΌμ΄μΈνΈ: FTP λͺ
λ ΉμΌλ‘ λ³ν ("NLST -l")
β
3. [λ°μ΄ν° μ°κ²° νμν κ²½μ°]
- ν΄λΌμ΄μΈνΈ: λ°μ΄ν° μμΌ μμ± λ° λκΈ°
- ν΄λΌμ΄μΈνΈ: PORT λͺ
λ ΉμΌλ‘ ν¬νΈ μ 보 μ μ‘
- μλ²: 200 Port command successfully
- μλ²: ν΄λΌμ΄μΈνΈμ λ°μ΄ν° μμΌμ μ°κ²°
β
4. ν΄λΌμ΄μΈνΈ: λ³νλ FTP λͺ
λ Ή μ μ‘
β
5. μλ²: λͺ
λ Ή νμ± λ° μ€ν
β
6. μλ²: μ€ν κ²°κ³Όλ₯Ό λ°μ΄ν° μ°κ²°λ‘ μ μ‘ (λλ μ μ΄ μ°κ²°λ‘ μλ΅)
β
7. μλ²: μλ£ λ©μμ§ μ μ‘ (226 Complete transmission)
β
8. ν΄λΌμ΄μΈνΈ: κ²°κ³Ό μΆλ ₯ λ° λ°μ΄ν° μ°κ²° μ’
λ£
access.txt νμΌμ νμ©ν IP μ£Όμ ν¨ν΄μ μμ±ν©λλ€.
νμ:
- μ νν IP:
127.0.0.1 - μμΌλμΉ΄λ μ¬μ©:
128.134.64.*(128.134.64.0~255 νμ©) - λ€μ€ μμΌλμΉ΄λ:
203.245.*.*
μμ νμΌ:
127.0.0.1
128.134.64.*
128.134.57.*
128.134.54.171
203.245.*.*
*.*.0.1
passwd νμΌμ μ¬μ©νμ¬ μ¬μ©μλ₯Ό μΈμ¦ν©λλ€. μ΄ νμΌμ μμ€ν
μ /etc/passwd νμΌ νμμ λ°λ¦
λλ€.
μΈμ¦ λ°©μ:
- μ¬μ©μλͺ κ³Ό λΉλ°λ²νΈλ₯Ό νλ¬ΈμΌλ‘ λΉκ΅ (μ€μ μμ€ν κ³Ό λ¬λ¦¬ μνΈνλμ§ μμ)
- λ‘κ·ΈμΈ μ€ν¨ μ μ΅λ 3νκΉμ§ μ¬μλ κ°λ₯
- 3ν μ€ν¨ μ μΈμ μ’ λ£ (530 Failed to log-in)
| μ¬μ©μ λͺ λ Ή | FTP λͺ λ Ή | μ€λͺ |
|---|---|---|
ls |
NLST |
νμΌ λͺ©λ‘ (μ΄λ¦λ§) |
ls -a |
NLST -a |
μ¨κΉ νμΌ ν¬ν¨ λͺ©λ‘ |
ls -l |
NLST -l |
μμΈ μ 보 ν¬ν¨ λͺ©λ‘ |
ls -al |
NLST -al |
μ¨κΉ νμΌ ν¬ν¨ μμΈ λͺ©λ‘ |
dir |
LIST |
λλ ν 리 μμΈ λͺ©λ‘ |
pwd |
PWD |
νμ¬ μμ λλ ν 리 |
cd [κ²½λ‘] |
CWD [κ²½λ‘] |
λλ ν 리 λ³κ²½ |
cd .. |
CDUP |
μμ λλ ν λ¦¬λ‘ μ΄λ |
mkdir [μ΄λ¦] |
MKD [μ΄λ¦] |
λλ ν 리 μμ± |
rmdir [μ΄λ¦] |
RMD [μ΄λ¦] |
λλ ν 리 μμ |
delete [μ΄λ¦] |
DELE [μ΄λ¦] |
νμΌ μμ |
rename [old] [new] |
RNFR [old]RNTO [new] |
νμΌ μ΄λ¦ λ³κ²½ (2λ¨κ³) |
get [νμΌ] |
RETR [νμΌ] |
νμΌ λ€μ΄λ‘λ |
put [νμΌ] |
STOR [νμΌ] |
νμΌ μ λ‘λ |
bin |
TYPE I |
λ°μ΄λ리 λͺ¨λ |
ascii |
TYPE A |
ASCII λͺ¨λ |
type binary |
TYPE I |
λ°μ΄λ리 λͺ¨λ |
type ascii |
TYPE A |
ASCII λͺ¨λ |
quit |
QUIT |
μΈμ μ’ λ£ |
μ΄ κ΅¬νμμ μ¬μ©νλ μ£Όμ FTP μλ΅ μ½λ:
| μ½λ | μλ―Έ | μ¬μ© μμ |
|---|---|---|
150 |
λ°μ΄ν° μ°κ²° μ΄λ¦Ό | νμΌ μ μ‘ λλ λͺ©λ‘ μ μ‘ μμ μ |
200 |
λͺ λ Ή μ±κ³΅ | PORT λͺ λ Ή μ±κ³΅ λ± |
201 |
νμ μ€μ μ±κ³΅ | TYPE λͺ λ Ή μ±κ³΅ |
220 |
μλΉμ€ μ€λΉλ¨ | μλ² μμ μ Welcome λ©μμ§ |
226 |
μ μ‘ μλ£ | νμΌ/λͺ©λ‘ μ μ‘ μλ£ |
230 |
λ‘κ·ΈμΈ μ±κ³΅ | μΈμ¦ μ±κ³΅ |
250 |
νμΌ μμ μ±κ³΅ | CWD, MKD, RMD, DELE λ± μ±κ³΅ |
257 |
κ²½λ‘λͺ νμ | PWD λͺ λ Ή μλ΅ |
331 |
λΉλ°λ²νΈ νμ | USER λͺ λ Ή ν |
350 |
νμΌ μ‘΄μ¬, μ΄λ¦ λ³κ²½ μ€λΉ | RNFR λͺ λ Ή ν |
430 |
μλͺ»λ μ¬μ©μλͺ /λΉλ°λ²νΈ | μΈμ¦ μ€ν¨ |
431 |
μ κ·Ό κ±°λΆ | IP μ κ·Ό μ μ΄ μ€ν¨ |
502 |
λͺ λ Ή 미ꡬν λλ μ€λ₯ | TYPE λͺ λ Ή μ€λ₯ λ± |
550 |
νμΌ/λλ ν 리 μμ μ€ν¨ | νμΌ μμ, κΆν μμ λ± |