프로토콜이 적용된 파일 서버를 작성해보자.

 

MYCMD cmd;
while (::recv(hClient, (char*)&cmd, sizeof(MYCMD), 0) > 0)
{
	switch (cmd.nCode)
	{
	case CMD_GET_LIST:
		puts("클라이언트가 파일목록을 요구함.");
		SendFileList(hClient);
		break;

	case CMD_GET_FILE:
		puts("클라이언트가 파일전송을 요구함.");
		{
			GETFILE file;
			::recv(hClient, (char*)&file, sizeof(file), 0);
			SendFile(hClient, file.nIndex);
			break;
		}

	default:
		ErrorHandler("알 수 없는 명령을 수신했습니다.");
		break;
	}
}

 

recv 함수를 이용해 MYCMD 크기만큼 끊어서 가져온다.

nCode 즉, 명령 코드에 따라 switch-case로 분류해서 함수를 실행한다.

 

SendFile 함수 ( 파일을 클라에게 송신하는 함수 )

void SendFile(SOCKET hClient, int nIndex)
{
    MYCMD cmd;
    ERRORDATA err;
    //파일 리스트에서 인덱스에 맞는 파일을 검사한다.
    if (nIndex < 0 || nIndex > 2)
    {
        cmd.nCode = CMD_ERROR;
        cmd.nSize = sizeof(err);
        err.nErrorCode = 0;
        strcpy_s(err.szDesc, "잘못된 파일 인덱스 입니다.");

        //오류 정보를 클라이언트에게 전송.
        send(hClient, (const char*)&cmd, sizeof(cmd), 0);
        send(hClient, (const char*)&err, sizeof(err), 0);
        return;
    }

    //파일 송신 시작을 알리는 정보를 전송한다.
    cmd.nCode = CMD_BEGIN_FILE;
    cmd.nSize = sizeof(FILEINFO);
    send(hClient, (const char*)&cmd, sizeof(cmd), 0);
    //송신하는 파일에 대한 정보를 전송한다.
    send(hClient, (const char*)&g_aFInfo[nIndex], sizeof(FILEINFO), 0);

    FILE *fp = NULL;
    errno_t nResult = fopen_s(&fp, g_aFInfo[nIndex].szFileName, "rb");
    if (nResult != 0)
        ErrorHandler("전송할 파일을 개방할 수 없습니다.");

    //파일을 송신한다.
    char byBuffer[65536]; //64KB
    int nRead;
    while ((nRead = fread(byBuffer, sizeof(char), 65536, fp)) > 0)
    {
        send(hClient, byBuffer, nRead, 0);
    }		

    fclose(fp);
}

 

파일을 클라에게 전송하는 함수.

클라가 원하는 파일의 인덱스를 선택하면 서버가 해당 파일을 클라한테 전송한다.

 

MYCMD 헤더 정보로 전송할 파일에 대한 정보를 담아 먼저 보내주고 ( 2번으로 나눠서 보냄 ), 

파일 데이터를 읽어 클라에게 전송한다. 

 

Wireshark를 이용해서 실제로 데이터가 어떻게 갔는지 살펴보자.

 

 

cmd.nCode = CMD_BEGIN_FILE;
cmd.nSize = sizeof(FILEINFO);
send(hClient, (const char*)&cmd, sizeof(cmd), 0);

 

위 그림은 위 코드를 Wireshark로 살펴본 결과다. 

00 00 00 c9 : 201 은 나타내고 이는 CMD_BEGIN_FILE의 정수값과 같다.

00 00 01 08 : 264 은 FILEINFO의 크기를 나타낸다.

 

 

 

위 그림으로 클라가 선택한 파일의 이름이 전송되는 것을 확인할 수 있다.

+ Recent posts