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;
	}
}

 

앞서 받은 헤더 정보를 바탕으로 파일을 서버로부터 수신 받는다.

+ Recent posts