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 |