BOOL TransmitFile(
SOCKET hSocket, // 연결될 소켓
HANDLE hFile, // 전송할 파일의 핸들, NULL일 경우 밑의 lpTransmitBuffers를 사용한다
DWORD nNumberOfBytesToWrite, // 파일로부터 전송할 양, 0일경우 전체를 전송
DWORD nNumberOfBytesPerSend, // 한번 전송할 때 전송할 블록의 크기, 0일경우 디
폴트 크기로 전송(NT : 4k, SERVER : 64k)
LPOVERLAPPED lpOverlapped, // OVERLAPPED구조체의 offset 필드에 전송을 시작
할 위치 지정, NULL일 경우 현재위치에서부터 전송
LPTRANSMIT_FILE_BUFFERS lpTransmitBuffers, // 위의 두번째 항목이 NULL일 경우 사
용하며 TRANSMIT_FILE_BUFFERS의 포인터
DWORD dwFlags // 파일 전송과 관련된 동작방식을 정의
);
//TransmitFile의 플래그
TF_DISCONNECT : 전송 작업이 완료되면 트랜스포트 레벨 접속을 끊는다
TF_REUSE_SOCKET : 전송 작업이 완료된 이후에 소켓을 재사용 할 수 있도록 한다. 이 소켓은 AcceptEx 함수에 의해 재활용 될 수 있다. 이 플래그는 TF_DISCONNECT와 함께 사용해야함.
TF_USE_DEFAULT_WORKER : 시스템 디폴트 스레드를 이용해서 파일을 전송한다. 이 플래그는 큰 파일을 전송할 때 유용하다.
TF_USE_SYSTEM_THREAD : 시스템 스레드를 이용해서 파일을 전송한다.TF_USE_KERNEL_APC : 전송 작업을 처리하는데 커널 APC를 사용한다. 커널 APC는 응용프로그램이 대기 상태일 때 작동된다.(경고성 대기 상태일 필요는 없다).
TF_WRITE_BEHIND : TrnasmitFile 호출이 데이터가 전송 완료되기 전에 리턴된다. TF_DISCONNECT나 TF_REUSE_SOCKET 플래그와 함께 사용할 수 없다.
-> 웹서버와 같은 파일 I/O가 필요한 경우에 유용하다. TF_REUSE_SOCKET 같은 플래그는 AcceptEx에서 사용하고 TransmitFile을 호출한 후 데이터를 전송하고 끝나면 다시 AcceptEx를 호출하는데 사용하는 방법이 있고, 인자에서 파일 핸들과 버퍼를 NULL로 설정하고 플래그로 TF_REUSE_SOCKET 를 사용하면 억셉트시 다시 사용할 수 있다.
단 NT 4.0 이상의 버전에서만 지원한다. 또한 home, professional 버전에서는 동시에 두개만이 동작한다. 더이상 호출하면 먼저 호출한 작업이 끝날 때까지 작업이 큐에 쌓여 있게된다. 서버에서만 완벽히 지원.
참고 : 정보문화사 NETWORK PROGRAMMING FOR MS WINDOWS II
[출처] [확장 윈속 API] TransmitFile|작성자 오아시셔
'DEV-Language > NetWorkServer Programming' 카테고리의 다른 글
KGDS2007 Proactor 패턴 기반 IOCP 대용량 서버 디자인 (0) | 2009.02.02 |
---|---|
Online game의 Vista 효과와 보안이슈 (0) | 2009.01.31 |
소켓 관련 API후킹자료 (0) | 2009.01.31 |
게임서버프로그래머가 되는길 (0) | 2009.01.30 |
[네트워크] 커널 오브젝트 동기화 (0) | 2009.01.26 |