TransmitFile을 이용하면 파일을 송신하기 전에 파일에 대한 정보를 보낼 수 있었다.
따라서 헤더파일이라고도 할 수 있는 구조체의 정보를 토대로 파일을 수신하면 된다.
//수신할 파일명, 크기 정보를 먼저 받는다.
MY_FILE_DATA fData = { 0 };
if (::recv(hSocket, (char*)&fData, sizeof(fData), 0) < sizeof(fData))
ErrorHandler("파일 정보를 수신하지 못했습니다.");
파일을 수신하기 전에 헤더를 받아서 파일의 대한 정보를 받는다.
//수신할 파일을 생성한다.
puts("*** 파일 수신을 시작합니다. ***");
HANDLE hFile = ::CreateFileA(
fData.szName,
GENERIC_WRITE,
0,
NULL,
CREATE_ALWAYS, //파일을 생성한다.
0,
NULL);
if (hFile == INVALID_HANDLE_VALUE)
ErrorHandler("전송할 파일을 개방할 수 없습니다.");
//서버가 전송하는 데이터를 반복해 파일에 붙여 넣는다.
char byBuffer[65536]; //64KB
int nRecv;
DWORD dwTotalRecv = 0, dwRead = 0;
while (dwTotalRecv < fData.dwSize)
{
if ((nRecv = ::recv(hSocket, byBuffer, 65536, 0)) > 0)
{
dwTotalRecv += nRecv;
//서버에서 받은 크기만큼 데이터를 파일에 쓴다.
::WriteFile(hFile, byBuffer, nRecv, &dwRead, NULL);
printf("Receive: %d/%d\n", dwTotalRecv, fData.dwSize);
fflush(stdout);
}
else
{
puts("ERROR: 파일 수신 중에 오류가 발생했습니다.");
break;
}
}
앞서 받은 헤더 정보를 바탕으로 파일을 서버로부터 수신 받는다.
'네트워크' 카테고리의 다른 글
[네트워크] 프로토콜 적용 파일 서버 (0) | 2025.04.22 |
---|---|
[네트워크] 프로토콜이 적용된 파일 송/수신 (0) | 2025.04.22 |
[네트워크] 파일 송신 전용 API ( TransmitFile ) (0) | 2025.04.20 |
[네트워크] 파일 송신 개선 (0) | 2025.04.20 |
[네트워크] 파일 수신 (0) | 2025.04.20 |