프로토콜이 적용된 파일 서버를 작성해보자.
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 |