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


Posted by 몽센트