2009년 11월 8일 일요일

TransmitFile()에 대해서..

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

첫번째 인자 : 파일을 전송할 소켓의 핸들

 

두번째 인자 : 전송할 파일의 핸들 (반드시 FILE_FLAG_SEQUENTIAL_SCAN 속성이 주어져야 한다. 이 속성은 파일을 처음부터 끝까지 순차적으로만 접근한다는 의미이다.)

세번째 인자 : 전송할 파일의 크기 (0으로 하면 파일 전체를 전송)

네번째 인자 : 파일을 전송할 때 내부적으로 ::send()함수를 사용하며 이때 버퍼의 크기를 얼마로 할것인지 명시하는 것.

 

다섯번째 인자 : OVERLAPPED 구조체에 대한 포인터(네트워크 입/출력을 비동기적으로 처리할 수 있도록 하였다면 이부분도 지원해 준다. 동기적 처리는 NULL)

여섯번째 인자 : TRANSMIT_FILE_BUFFERS 구조체에 대한 포인터(NULL 이면 파일 내용만 전송)

마지막 인자 : 기타 옵션

[ 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 플래그와 함께 사용할 수 없다.]

 

Stdafx.h 파일을 열어서 ::TransmitFile() 함수에 대한 정보가 담긴 헤더와 라이브러리 설정 코드를 추가한 다음 결과를 확인한다!

 

#include <Mswsock.h>

#pragma comment(lib, "Mswsock.lib")

 

어떻게 사용했냐..간단히 함수 부분만 넣어보겠다.

 

ret = TransmitFile(ClientSock, hFileSource, (DWORD)0, 15000, NULL, NULL, 

                           TF_DISCONNECT);
   if (ret == SOCKET_ERROR)
   {
             strTmp.Format("TransmitFile error code : %d", WSAGetLastError());
              AfxMessageBox(strTmp);
   }
   else {
              strTmp = "파일 전송이 완료되었습니다.";
               InsertChatStr(strTmp,3);
   }

댓글 없음:

댓글 쓰기