Mini Cloud는 리눅스 시스템 프로그래밍의 핵심 개념(Socket, Fork, Signal, File I/O)을 활용하여 구현한 동시성 파일 전송 시스템입니다. 여러 클라이언트가 동시에 접속하여 파일을 업로드, 다운로드, 관리할 수 있는 클라우드 스토리지 서비스의 핵심 기능을 제공합니다.
- UPLOAD: 로컬 파일을 서버로 전송합니다. 원자적(Atomic) 파일 교체를 통해 전송 중 오류가 발생해도 기존 파일이 손상되지 않습니다.
- DOWNLOAD: 서버에 저장된 파일을 로컬로 다운로드합니다.
- DOWNLOAD ALL: 서버에 있는 모든 파일을 한 번에 다운로드합니다.
- LIST: 서버에 저장된 파일 목록을 조회합니다.
- DELETE: 서버에 저장된 파일을 삭제합니다.
- Multi-Client Support:
fork()를 사용하여 각 클라이언트 접속마다 독립적인 자식 프로세스를 생성, 다수의 클라이언트가 동시에 작업을 수행할 수 있습니다. - Zombie Process Prevention:
SIGCHLD시그널을 핸들링하여 종료된 자식 프로세스 자원을 즉시 회수합니다.
- Token Authentication: 서버와 클라이언트 간 공유된 비밀 토큰(Secret Token)을 통해 인가된 사용자만 접속을 허용합니다.
- Path Traversal Protection:
../와 같은 경로 조작 시도를 차단하여 서버 파일 시스템을 보호합니다. - Upload Size Limit: 서버 디스크 보호를 위해 업로드 파일의 최대 크기를 제한할 수 있습니다.
프로젝트 루트 디렉토리에서 make를 실행하여 서버와 클라이언트를 빌드합니다.
make clean
make all빌드가 완료되면 bin/ 디렉토리에 실행 파일이 생성됩니다.
서버를 실행할 포트 번호를 지정하여 실행합니다. (선택적으로 저장소 경로 지정 가능)
# 기본 실행 (포트 9000)
./bin/server 9000
# 저장소 경로 지정 실행
./bin/server 9000 ./my_storage환경 변수 설정 (옵션):
MC_SERVER_TOKEN: 인증 토큰 설정 (예:export MC_SERVER_TOKEN=secret123)MC_MAX_UPLOAD_BYTES: 업로드 용량 제한 (바이트 단위)
서버의 IP 주소와 포트 번호를 입력하여 접속합니다.
./bin/client 127.0.0.1 9000인증 토큰 사용 시:
# 환경 변수로 토큰 전달
export MC_CLIENT_TOKEN=secret123
./bin/client 127.0.0.1 9000접속 후 다음과 같은 명령어를 사용할 수 있습니다.
mini-cloud> LIST # 파일 목록 조회
mini-cloud> UPLOAD file.txt # 파일 업로드
mini-cloud> DOWNLOAD file.txt # 파일 다운로드
mini-cloud> DOWNLOAD ALL # 전체 파일 다운로드
mini-cloud> DELETE file.txt # 파일 삭제
mini-cloud> QUIT # 종료이 프로젝트는 리눅스 시스템 콜을 직접 사용하여 저수준(Low-level) 동작 원리를 이해하고 구현하는 데 초점을 맞췄습니다.
- Client-Server Model: TCP/IP 소켓을 기반으로 통신합니다.
- Process-based Concurrency:
fork()시스템 콜을 사용하여 'Connection per Process' 모델을 구현했습니다. 이는 구현이 직관적이고 프로세스 간 메모리가 격리되어 있어 한 클라이언트의 크래시가 서버 전체에 영향을 주지 않는 장점이 있습니다.
socket(),bind(),listen(): 서버 소켓 생성 및 대기accept(): 클라이언트 연결 수락connect(): 클라이언트의 서버 접속
fork(): 클라이언트 처리를 위한 자식 프로세스 생성waitpid():SIGCHLD시그널 핸들러 내에서 호출하여 좀비 프로세스 제거sigaction():SIGCHLD(자식 종료),SIGPIPE(연결 단절) 등 시그널 처리 설정
open(),read(),write(),close(): 기본적인 파일 읽기/쓰기rename(): 원자적 파일 교체를 위해 사용. 임시 파일에 업로드를 완료한 후 원본 파일명으로 교체하여, 전송 중단 시 불완전한 파일이 남는 것을 방지합니다.unlink(): 파일 삭제 및 임시 파일 정리opendir(),readdir(): 디렉토리 내 파일 목록 조회
바이너리 기반의 독자적인 프로토콜을 설계하여 오버헤드를 최소화했습니다.
typedef struct {
uint32_t magic; // 프로토콜 식별자 (Magic Number)
uint8_t version; // 프로토콜 버전
uint8_t command; // 명령어 (UPLOAD, DOWNLOAD, LIST, ...)
uint32_t filename_len; // 파일명 길이
uint64_t payload_len; // 데이터(Payload) 크기
} mc_packet_header_t;- Endianness Handling:
htonl(),ntohl()등을 사용하여 네트워크 바이트 오더(Big-endian)를 준수, 서로 다른 아키텍처 간의 호환성을 보장합니다.
mini-cloud/
├── include/ # 헤더 파일 (프로토콜, 서버/클라이언트 인터페이스)
├── src/
│ ├── client/ # 클라이언트 소스 코드
│ ├── server/ # 서버 소스 코드
│ └── common/ # 공통 유틸리티 (프로토콜 처리 등)
├── scripts/ # 배포 및 유틸리티 스크립트
└── tests/ # 테스트 코드 및 스크립트