C++

[C++] FTP Timeout 설정 예제 (InternetSetOption)

Let it out 2024. 1. 18. 00:49

InternetSetOption 함수를 사용하면  FTP 연결, Data 송신, Data 수신 할 때 등 TimeOut 설정이 가능함.

 

TimeOut이 가끔 안되는 버그가 있다고 함.

그럴 때는 Thread 하나 만들어서 InternetSetOption 함수 감시해주면 됨.

 

나는 문제없이 사용함.

1. 함수 원형

BOOL InternetSetOption(

        IN HINTERNET hInternet OPTIONAL,     //Ftp Internet 핸들(Internet 핸들)

        IN DWORD Option,    //Time Out Define 를 default로 작성(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);
}
 

 

 
 

 

 

 

반응형

'C++' 카테고리의 다른 글

[C++ ] 2차원 포인터 정리  (0) 2024.01.25
[C++ ] 1차원 포인터 정리  (0) 2024.01.25
[C++] Vector(벡터) 사용법  (0) 2024.01.18
[C++] FTP 파일 찾기 예제 (FtpFindFirstFile)  (0) 2024.01.18
[C++] FTP 예제(SImple Ftp Class)  (0) 2024.01.18