1. 작업 환경 

    - Oracle VM VirtualBox

    - ubuntu 22.04

    - PuTTY

    - 언어 : C

 

2. 조건 

    - 실행 방법

       * 서버 프로그램 : $./file_server 5000 recv.txt

       * 클라이언트 프로그램 : $./file_client 127.0.0.1 5000 file_client.c

    - 클라이언트 프로그램에서는 네번째 아그먼트 파일이름 file_client.c100 Byte 읽어 전송하고,

      서버프로그램은 세 번째 아그먼트 파일이름 recv.txt 파일로 동일한 파일 사이즈로 저장

    - 명령행 아그먼트가 조건에 맞지 않을 경우 사용법을 출력

       * 서버 프로그램 : Usage : ./server_file <port> <file> 

       * 클라이언트 프로그램 : Usage : ./client_file <IP> <port> <file>

    - 서버 프로그램에서는 저장한 파일이 존재하지 않을 경우 새로 파일을 생성하고, 파일이 존재할 때는 모든 내용을 지우

       고 새로 저장, 파일 속성은 644

    - 클라이언트 프로그램에서 읽을 파일이 존재하지 않을 경우 perror() 함수를 사용하여 오류 원인 메시지를 출력

       * <file> file open error

       * open() : No such file or directory

    - 모든 시스템 콜 함수는 예외 처리를 반드시 처리하여 에러 메시지를 출력

 

3. Server 코드 작성 

     * 깃허브 : https://github.com/Byungeun/file_transfer

    - TCP/IP 소캣 프로그래밍에서 사용하는 기본 코드를 활용하여 파일 전송 서버/클라이언트를 코드를 작성

    - 사용할 변수 선언

    - 조건절 중 우선적으로 아그먼트 수를 확인하고 미충족시 종료하는 코드 작성

    - 다음으로는 불필요하게 코드가 실행되지 않도록 콜 함수를 사용해서 파일을 오픈하고, 데이터가 없을시 종료하는

      코드 작성 

    - 아그먼트 수가 충족, 데이터 유무 파악 후 통신을 위한 소캣 함수 부터 작성함 

    - Server에서 사용자 정의로 수정할때는 accept() 함수 이후 코드를 작성하는데  소켓으로 받아 온 데이터가 존재할 경우,

      while문을 활용하여 정해진 데이터 크기에 맞게 파일을 읽고 저장하는 것을 전송 완료시까지 반복하는 코드 작성  

    - 데이터가 전송될때 마다 출력

 

4. Client 코드 작성 

     * 깃허브 : https://github.com/Byungeun/file_transfer

    - TCP/IP 소캣 프로그래밍에서 사용하는 기본 코드를 활용하여 파일 전송 서버/클라이언트를 코드를 작성

    - 사용할 변수 선언

    - 조건절 중 우선적으로 아그먼트 수를 확인하고 미충족시 종료하는 코드 작성

    - 다음으로는 불필요하게 코드가 실행되지 않도록 콜 함수를 사용해서 파일을 오픈하고, 데이터가 없을시 종료하는

      코드 작성 

    - 아그먼트 수가 충족, 데이터 유무 파악 후 통신을 위한 소캣 함수부터 작성함 

    - Client 에서 사용자 정의로 수정할때는 connect() 함수 이후 코드를 작성하는데  오픈한 데이터가 존재할 경우, while문

      을 활용하여 정해진 데이터 크기에 맞게 파일을 읽고 완료시까지 반복 전송하는 코드 작성

'C언어' 카테고리의 다른 글

TCP/IP 소켓 프로그래밍  (0) 2024.10.10
간단한 파일 복사 유틸리티 구현  (0) 2024.10.10
C언어 연산자  (0) 2024.10.08
C언어 문자열 저장 (2)  (1) 2024.10.08
C언어 문자열 저장 (포인터, 배열 포함)  (0) 2024.10.08

1. 작업 환경 

    - Oracle VM VirtualBox

    - ubuntu 22.04

    - PuTTY

    - 언어 : C

 

2. TCP 기반 서버, 클라이언트의 함수 호출 관계

     - 전화기로 비유하자면 socket()은 전화기를 만드는 것 

     - bind()는 전화번호 부여 

     - listen()은 대기 상태, TCP 연결은 기본적으로 1:1 연결이지만 대기 수는 정의할 수 있음 

     - accept()는 전화를 받을 수 있는 상태

     - read()는 수신된 데이터를 읽는 역할 

     - write()는 송신할 데이터 

     - 주로 수정하는 부분은 read()/write()

 

3. 기본 Server 코드 

     - 기본 Server 코드를 활용하여 응용할 수 있음 

     - 19번째 줄에 문자형 변수는 변형이 가능 

     - TCP 통신을 하고 싶으면 26번째 줄에서 SOCK_STREAM 을 사용하고 

        UDP 통신을 하고 싶으면 26번째 줄에서 SOCK_DGRAM을 사용

        * 코드 참고(깃허브) : https://github.com/Byungeun/basic_server

 

 

4. 기본 Client 코드 

     * 코드 참고(깃허브) : https://github.com/Byungeun/basic_client

 

5. 느낀점 : 통신 흐름을 잘 이해하면 기본 코드를 사용하여 다양한 기능의 서버를 구축할 수 있음 

1. 작업 환경 

    - Oracle VM VirtualBox

    - ubuntu 22.04

    - PuTTY

    - 언어 : C

 

2. 파일 복수 유틸리티 구현 

    - 필요한 함수를 사용하기 위한 헤더함수 include

    - main 함수 정의

    - argc는 명령줄 인자의 개수

    - argv는 명령줄 인자들을 가리키는 문자열 배열

    - n, in, out 변수 정의 

    - in 변수는 첫번째 인자의 open 값을 저장

    - out 변수는 두번째 인자의 open 값을 저장 

    - n 변수는 in 변수에서 읽은 값을 저장 

    - buf 문자형 변수 정의 : 없어도 상관없으나, 성능이 떨어지기 때문에 buf 문자형 변수를 정의해주는 것이 좋음

    - 1번째 if 조건 정의 : 필요한 인자 개수 정의 및 에러 설정  

    - 에러 설정할때는 < 0 을 권장, 에러가 -1 이나 -2 일 수도 있기 때문

    - 출력을 구현할때는 write() 함수를 사용하는 것 보다는 printf() 함수를 사용하는 것이 더 좋음

    - 2번째 if 조건 정의 : 첫번째 파일의 open 정의 및 에러 설정 

    - 3번째 if 조건 정의 : 두번째 파일의 open 정의 및 에러 설정 

    - 첫번째 파일에 데이터가 있다면 데이터를 읽은 후 n 변수에 저장하여 n을 두번째 파일에 씀 

    - 필요한 기능이 모두 작성됐으면 close 로 파일을 닫아 줌 

 

3. 실습하면서 궁금했던 점 

     - 꼭 while 문으로 써야하는 것인가? : 파일이 buf 에서 정의된 데이터 크기 보다 클 경우 파일 전체를 한번에 읽을 수가

       없음. 따라서 while 문이 필요함 

     -  n 변수는 왜 close 하지 않을까? : n 은 파일 디스크립터가 아닌, 바이트 수를 나타내기 때문에 close 할 필요가 없음 

 

4. 느낀점

     - 아래 코드는 반복적으로 연습해서 외운 후 작성할 수 있는 능력을 갖춘다면 다양한 코드를 구조화해서 이해하고 응용

        하는데 도움이 될 것 같다.

     -  if문 조건을 설정할때는 매개변수가 입력되는 부분부터 정의하고, 조건 마다 에러 조건을 설정하고 에러 조건은 "< 0"

        을 사용하는 것이 좋을 것 같다. 

      

'C언어' 카테고리의 다른 글

파일 전송 서버/클라이언트 만들기 실습  (2) 2024.10.11
TCP/IP 소켓 프로그래밍  (0) 2024.10.10
C언어 연산자  (0) 2024.10.08
C언어 문자열 저장 (2)  (1) 2024.10.08
C언어 문자열 저장 (포인터, 배열 포함)  (0) 2024.10.08

+ Recent posts