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);
}
댓글 없음:
댓글 쓰기