네트워크

[네트워크] 프로토콜이 적용된 파일 송/수신

program-yam 2025. 4. 22. 13:25

프로토콜을 적용한 파일 송/수신을 작성해보자.

 

  • 기본 헤더와 확장 헤더로 나눠서 정의한다.
  • 기본 헤더는 이어지는 확장 헤더를 결정하기 위한 코드 값을 포함한다.
  • 코드 값에 따라 switch-case를 이용해 해당 코드에 따른 작업을 수행한다.

클라가 서버로 패킷을 스트림 형태로 전송했을 때, 서버에서는 recv를 이용해서 끊어내는 작업을 한다.

여기서 끊어낸다는 것은 패킷에 대해 헤더 크기만큼 끊어내서 헤더 정보를 알아내고, 헤더안에 있는 정보를 통해 나머지 페이로드를끊어내는 작업을 말한다.

 

기본 헤더 구조체

//기본헤더
typedef struct MYCMD
{
	int nCode;    //명령코드
	int nSize;    //데이터의 바이트 단위 크기
} MYCMD;

 

헤더는 명령 코드 값과 헤더를 제외한 페이로드의 크기를 담을 변수로 구성된다.

명령 코드는 확장 헤더의 해석 방식을 결정하는 역할을 한다.

사이즈 값은 데이터 수신의 완료 여부를 판단하는 기준으로 활용한다.

 

확장 헤더 구조체

//확장헤더: 에러 메시지 전송헤더
typedef struct ERRORDATA
{
    int nErrorCode;    //에러코드: ※향후 확장을 위한 멤버다.
    char szDesc[256];  //에러내용
} ERRORDATA;

 

//확장헤더: S->C: 파일 리스트 전송
typedef struct SEND_FILELIST
{
    unsigned int nCount;    //전송할 파일정보(GETFILE 구조체) 개수
} SEND_FILELIST;

 

기본 헤더 구조체 명령 코드에 따라 해석할 구조를 나타낸다.

 

명령 코드 열거형

//MYCMD 구조체의 nCode 멤버에 적용될 수 있는 값
typedef enum CMDCODE {
    CMD_ERROR = 50,          //에러
    CMD_GET_LIST = 100,      //C->S: 파일 리스트 요구
    CMD_GET_FILE,            //C->S: 파일 전송 요구
    CMD_SND_FILELIST = 200,  //S->C: 파일 리스트 전송
    CMD_BEGIN_FILE           //S->C: 파일 전송 시작을 알림.
} CMDCODE;

 

열거형을 이용해 명령코드를 정수형으로 정의한다.

일정 수 만큼 간격을 두어서 추후에 같은 카테고리안에 있는 에러 코드를 추가할 수 있도록 한다.