2016년 6월 15일 수요일

뇌자극 TCP_IP 프로그래밍 26강 요약

26강 파일 전송 프로그램 개발

이제부터는 여태 배운 것을 토대로 프로그램을 만들어본다.(여기까지 공부하느라 힘들었다 -_-)
파일 전송 프로그램 개발을 해보자.

1. 서비스 프로그램의 구성

서버/클라이언트 모델로 만든다.
서버 : 파일의 목록을 가지고 있다가 클라이언트가 요청하면 파일을 전송해준다.
클라이언트 : 서버에 있는 파일 목록을 조회하고, 파일 업로드, 파일 다운로드를 한다.

대략적인 모양은 다음과 같다.

              read                       파일 업로드
| 파일  |  -------->    | 파일 |    ------------------->  | 클라이언트 |
| 목록  |  <--------    | 서버 |    <-------------------  |                |
              write           |           파일 다운로드
                               |
                            | DB |
                           
그냥 책에 있는거 사진으로 찍어서 올릴껄 그랬다-_-;

2. 서비스 프로그램 개발 준비

프로그램 명세서

1) 서비스 내용 : 인터넷을 통한 파일 송수신
2) 기능 : 파일 다운로드, 파일 업로드, 파일 목록 전송
3) 파일 정보 저장 :  DB 서버는 파일 업로드 기능을 제공한다. 언제, 누가, 어떤 파일을 업로드 했는지 정보가 있어야 한다. 사용할 DBMS 는 SQLite 다.
4) 입출력 구조 :  서버는 여러 클라이언트를 동시에 처리해야 한다. 멀티 프로세스 방식을 사용한다.

DB 명세서

DB 명  : mydb.db
table 명  : file_info

필드 이름 | 데이터 크기 | 설명

name      | char(64)      | 파일 이름
ip           | char(64)      | 파일을 올린 IP 주소
up_date   | datetime     | 파일을 올린 시간
count      | int             | 다운로드 개수
size        | int             | 파일 크기

애플리케이션 프로토콜

클라이언트는 다음과 같이 간단한 구조체로 요청을 보낸다.
struct CProtocol
{
   int command;
   char f_name;
};
서버는 요청을 분석해서 구조체를 먼저 전송하고 그 다음 실제 요청에 대한 응답 데이터를 전송한다.
서버는 command 멤버 변수를 통해서 클라이언트에 응답 정보를 전송할 것이다.

3. SQLite DB

SQLite 설치

apt-get install sqlite3
apt-get install libsqulite3-dev

DB와 테이블 생성

cd DB를 생성할 경로
sqlite mydb.db  //mydb.db를 생성한다.

sqlite> 가 뜨는데 그 옆에 아래와 같이 치면 테이블이 생성된다.

sqlite> create table file_info
     ...>(
     ...>name char(64),
     ...>ip char(64),
     ...>up_date datetime,
     ...>count int,
     ...>size int
     ...>);

데이터를 입력해보자.
insert into file_info values('test.txt', '127.0.0.1', '2016/6/16 14:18:00', 0, 1000);

데이터를 조회해보자
select * from file_info;

주요 SQLite 함수

DB 파일 열기
sqlite3_open(const char *filename, sqlite3 **ppDb);

filename : 열고자 하는 DB 파일이름
ppDb : 열린 DB를 가리키는 포인터

sql 질의어 실행
sqlite3_exec(sqlite3 *pDb, const char *sql, int (*callback)(void*, int, int(*callback)(void*, int, char **, char**)void *arg, char **errmsg))

pDb : 열린 DB
sql : SQL 질의어
callback : SQL 가 실행되었을 때, 데이터를 처리할 콜백 함수
arg :  콜백 함수의 첫 번째 매개변수로 넘어갈 값을 가리키는 포인터
errmsg : 에러 메시지

열린 DB 닫기
sqlite3_close(sqlite3 *pDb)

pDb : 열린 DB

4. 서버 프로그램 개발

프로그램 흐름

총 3가지의 일을 해야 한다. (파일 목록, 파일 업로드, 파일 다운로드)

1) 클라이언트가 파일 목록을 요청하면
2) file_server 은 SQLite에 저장된 파일 정보를 읽어와
3) 클라이언트에 전송한다.

1) 파일 업로드를 요청하면
2) 데이터를 하드디스크에 파일로 저장한다.
3) 저장에 성공하면 파일 정보를 SQLite에 저장한다.

1) 파일 다운로드를 요청하면
2) 하드디스크에 동일한 파일이 있는지 확인한다.
3) 있다면 클라이언트에 전송한다.

5. 클라이언트 프로그램 개발

클라이언트는 CLI 방식으로 제작한다.
그리고 프로그램 실행인자를 이용한다.

프로그램 사용법은 다음과 같다. 프로그램 명은 flie_cli 다.

./file_cli -h -i [ip] -u [upload filename] -d [download filename] -l

-i : 연결할 서버의 인터넷 주소
-u [업로드 파일명] : 업로드할 파일 이름
-d [다운로드 파일명] : 다운로드할 파일 이름
-l : 파일 목록 요청(L의 소문자다)
-h : 도움말 출력

예) ./file_cli -i 127.0.0.1 -l <-----파일 목록 확인이다.

파일을 다룬다는 것 외에는 에코 클라이언트 프로그램과 거의 같다.

프로그램은 주석과 함께 깃허브에 올렸다.

소스 코드 받기

댓글 없음:

댓글 쓰기