프로토콜이 적용된 파일 서버를 작성해보자.
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의 크기를 나타낸다.

위 그림으로 클라가 선택한 파일의 이름이 전송되는 것을 확인할 수 있다.
'네트워크' 카테고리의 다른 글
| [네트워크] 소켓 (0) | 2025.04.22 | 
|---|---|
| [네트워크] 프로토콜 적용 파일 클라 (0) | 2025.04.22 | 
| [네트워크] 프로토콜이 적용된 파일 송/수신 (0) | 2025.04.22 | 
| [네트워크] 파일 수신 ( TransmitFile ) (0) | 2025.04.21 | 
| [네트워크] 파일 송신 전용 API ( TransmitFile ) (0) | 2025.04.20 |