TransmitFile 함수는 Windows에서 소켓을 통해 파일을 전송할 때 사용하는 함수다.
주로 TCP 소켓과 함께 사용된다.

 

BOOL TransmitFile(
  SOCKET hSocket,
  HANDLE hFile,
  DWORD nNumberOfBytesToWrite,
  DWORD nNumberOfBytesPerSend,
  LPOVERLAPPED lpOverlapped,
  LPTRANSMIT_FILE_BUFFERS lpTransmitBuffers,
  DWORD dwFlags
);

 

  • hSocket : 데이터를 전송할 대상 소켓의 핸들
  • hFile : 전송할 파일의 핸들. CreateFile을 통해 얻은 읽기 가능한 파일 핸들이어야 한다.
  • nNumberOfBytesToWrite : 전송할 바이트 수를 말한다. 0을 지정하면 파일의 끝까지 전송한다.
  • nNumberOfBytesPerSend : 한 번에 보낼 데이터 바이트 수다. 0이면 시스템이 적절한 크기로 자동 설정한다.
  • lpOverlapped : 비동기(Overlapped) 전송을 위한 OVERLAPPED 구조체 포인터다.
  • lpTransmitBuffers : 전송 전에 붙일 헤더 데이터를 지정하는 구조체 포인터다. 사용하지 않으면 NULL
  • dwFlags : 전송 동작을 제어하는 플래그

위 함수를 이용해서 파일 송신하는 서버를 만들어보자.

//전송할 파일에 대한 정보를 담기위한 구조체
typedef struct MY_FILE_DATA
{
    char szName[_MAX_FNAME];
    DWORD dwSize;
} MY_FILE_DATA;

 

구조체를 선언한다. 

전송할 파일에 대한 간단한 정보를 담고 있다.

  • szName : 전송할 파일의 이름
  • dwSize : 전송할 파일의 총 크기
//전송할 파일 개방
HANDLE hFile = ::CreateFile(_T("Sleep Away.zip"),
    GENERIC_READ,
    FILE_SHARE_READ,
    NULL,
    OPEN_EXISTING,
    FILE_FLAG_SEQUENTIAL_SCAN,
    NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
    ErrorHandler("전송할 파일을 개방할 수 없습니다.");
}

 

파일을 CreateFile을 이용해 생성한다. fopens으로 하면 HANDLE 값을 반환받을 수 없기 때문.

 

//전송할 파일에 대한 정보를 작성한다.
MY_FILE_DATA fData = { "Sleep Away.zip", 0 };
fData.dwSize = ::GetFileSize(hFile, NULL);
TRANSMIT_FILE_BUFFERS tfb = { 0 };
tfb.Head = &fData;
tfb.HeadLength = sizeof(fData);

 

앞서 선언한 구조체에 전송할 파일의 정보를 작성한다. 

 

//파일송신
if ( ::TransmitFile(
        hClient,	//파일을 전송할 소켓 핸들.
        hFile,		//전송할 파일 핸들.
        0,			//전송할 크기. 0이면 전체.
        65536,		//한 번에 전송할 버퍼 크기.
        NULL,		//비동기 입/출력에 대한 OVERLAPPED 구조체.
        &tfb,		//파일 전송에 앞서 먼저 전송할 데이터.
        0			//기타 옵션.
        ) == FALSE )
    ErrorHandler("파일을 전송할 수 없습니다.");

 

TransmitFile을 사용해 파일을 송신한다.

 

https://learn.microsoft.com/ko-kr/windows/win32/api/mswsock/nf-mswsock-transmitfile

 

TransmitFile 함수(mswsock.h) - Win32 apps

TransmitFile 함수(mswsock.h)는 연결된 소켓 핸들을 통해 파일 데이터를 전송합니다.

learn.microsoft.com

 

+ Recent posts