[C++] FTP Timeout 설정 법 예제 (InternetSetOption)
FTP 연결, Data 보낼 때, Data 수취 할 때 등 TimeOut 설정이 가능함.
TimeOut이 가끔 안되는 버그가 있다고 함.
그럴 때는 Thread 에서 감시하는 함수를 만들어서 감시 해주면 됨.
1. 함수 원형
BOOL InternetSetOption(
IN HINTERNET hInternet OPTIONAL, //Ftp Internet 핸들(Internet 핸들 임)
IN DWORD Option, //Time Out Define 적어주면 됨.(Time Out 종류)
IN LPVOID Buf, //Time Out Buffer
IN DWORD BufSize); //Time Out Buffer Size
}
2. InternetSetOption 함수 인자 값.
DWORD ms = 1000;
InternetSetOption(hInternet, INTERNET_OPTION_CONNECT_TIMEOUT, &ms, sizeof(ms));
// InternetSetOption 함수가 타임아웃뿐만 아니라 다른 기능도 많다. 찾아 보시길.(지원 안되는 기능과 버그가 많긴 함.)
3. 예제
void TestInternetOption() { HINTERNET hInternet; HINTERNET hFile; char Buf[1000]; DWORD ReadSize; BOOL bResult; DWORD ms; hInternet = InternetOpen( "WININET Sample Program", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); if(hInternet == NULL) printf("InternetOpen err(%d)\n", GetLastError()); else printf("InternetOpen succeed.\n"); ms = 1000; InternetSetOption(hInternet, INTERNET_OPTION_CONNECT_TIMEOUT, &ms, sizeof(ms)); InternetSetOption(hInternet, INTERNET_OPTION_CONTROL_RECEIVE_TIMEOUT, &ms, sizeof(ms)); InternetSetOption(hInternet, INTERNET_OPTION_CONTROL_SEND_TIMEOUT, &ms, sizeof(ms)); InternetSetOption(hInternet, INTERNET_OPTION_DATA_SEND_TIMEOUT, &ms, sizeof(ms)); InternetSetOption(hInternet, INTERNET_OPTION_DATA_RECEIVE_TIMEOUT, &ms, sizeof(ms)); if(!bResult) printf("InternetSetOption err(%d)\n", GetLastError()); else printf("InternetSetOption succeed.\n"); hFile = InternetOpenUrl( hInternet, "http://www.geocities.co.jp/SiliconValley-PaloAlto/5920/other.html", NULL, 0, INTERNET_FLAG_EXISTING_CONNECT | INTERNET_FLAG_RELOAD, 0); if(hFile == NULL) printf("InternetOpenUrl err(%d).\n", GetLastError()); else printf("InternetOpenUrl succeed.\n"); for(;;) { ReadSize = 1000; bResult = InternetReadFile( hFile, Buf, 1000, &ReadSize); if(!bResult) { printf("err(%d)\n", GetLastError()); break; } if(bResult && (ReadSize == 0)) break; Buf[ReadSize] = '\0'; printf("%s", Buf); } InternetCloseHandle(hFile); InternetCloseHandle(hInternet); }
댓글
댓글 쓰기