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
'네트워크' 카테고리의 다른 글
[네트워크] 프로토콜이 적용된 파일 송/수신 (0) | 2025.04.22 |
---|---|
[네트워크] 파일 수신 ( TransmitFile ) (0) | 2025.04.21 |
[네트워크] 파일 송신 개선 (0) | 2025.04.20 |
[네트워크] 파일 수신 (0) | 2025.04.20 |
[네트워크] 파일 송신 (0) | 2025.04.20 |