Coding & Programming/Network(TCP, IP, UDP)

[C언어/C++] Winsock 멀티스레드 1:N 대용량 파일 전송(송수신) 서버/클라이언트 구현하기(TCP/IP Windows socket) #1/3

mainCodes 2021. 4. 26. 10:45

[C언어/C++] Winsock 멀티스레드 1:N 대용량 파일 전송(송/수신) 서버/클라이언트 구현하기(TCP/IP Windows socket) #1/3

 

안녕하세요 JollyTree입니다 (•̀ᴗ•́)و

이번 포스팅은 윈속(Winsock)을 이용한 파일 전송에 대한 내용입니다. 파일 전송 기능은 모바일, 데스크톱 환경에서의 카카오톡, 텔레그램 등 각종 메신저 프로그램에서는 이제 필수가 된 기능으로 네트워크 프로그래밍을 스터디하기에는 좋은 주제라고 생각합니다. 

 

그리고 이번 자료는 지난번 1:N 채팅 프로그램을 스터디한 후 네트워크 프로그래밍에 더 익숙해지기 위한 내용이라 할 수 있습니다.

 

본론으로 들어가서,

 

프로그램의 기본적인 개념은 다음 그림과 같이 클라이언트는 파일을 전송하고 서버는 N개의 클라이언트들로부터 파일을 수신하여 지정된 폴더에 저장합니다.

 

프로그램 개념도

 

■ 서버 주요 기능 
  - N개의 클라이언트로 부터 동시에 파일을 수신하기 위해 멀티스레드 지원
  - 클라이언트로 부터 파일을 수신하여 지정된 저장 폴더에 저장

 클라이언트 주요 기능
  - 네트워크를 통해 서버에 파일 전송 

 

클라이언트와 서버가 서로 파일을 송신하고 수신하기 위해서는 파일을 어떻게 보내고 받는지에 대한 서로 간에 규약(약속)이 필요합니다.

 

예를 들어 서버는 파일을 수신하기 전에 클라이언트가 몇 바이트의 파일을 송신하려는지 모르기 때문에 클라이언트는 서버에게 파일을 송신하기 전에 보내려는 파일의 크기를 미리 알려주어야 합니다.

 

마치 보내고자 하는 우편물에 수신지의  주소(시, 도, 우편번호, 도로명 주소 등)를 적어 우편물이 정상적으로 전달되도록 하는 것과 유사합니다. 주소 작성 규칙이 없다면 우편물이 제대로 전달되기 어려울 테니까요 ㅎ

 

그래서 클라이언트가 서버에 파일을 보낼 때에는 다음과 같은 규약에 맞춰 파일을 보내고 서버는 동일한 규약을 따라 파일을 수신하도록 했습니다.


패킷 헤더는 네트워크 소켓 연결이 된 후 클라이언트가 서버에 먼저 송신하는 내용입니다.  서버는 패킷 헤더를 수신한 후 패킷 타입과 서버가 수신해야 할 패킷 길이를 먼저 식별하고 클라이언트로부터 파일이 전송되기를 기다립니다.

이후 클라이언트는 보내는 파일명과 파일 데이터가 포함된 패킷 데이터를 서버에 전송하고 서버는 패킷 헤더 내 패킷 길이만큼 패킷 데이터를 수신한 후 패킷 데이터에서 파일명을 분리하여 수신한 파일명으로 파일 데이터를 저장합니다. 

이해하기 쉽게 절차를 그림으로 표현하였습니다.

 

1:N 파일 송수신에 대한 개념과 절차를 정립했으니 다음에는 소스코드를 포스팅해보도록 하겠습니다.


상 JollyTree였습니다. (•̀ᴗ•́)و