wininet InternetOpenUrlA 設置訪問超時

利用wininet訪問網絡資源,有的網站不存在,會造成時間過長等問題,就想設置超時來解決這個問題,查到了API函數:InternetSetOption,不過這個函數設置之後毫無作用。。。開始查找其他解決方案,最終發現有單獨線程的方案可取,也就是利用線程來訪問,之後可以通過句柄來監控時間,具體代碼如下:

struct PARA
	{
		string url = "";
		string* requst = NULL;
		bool result = false;

		HINTERNET session = NULL;
		HINTERNET bS = NULL;
	};

	static DWORD WINAPI thread_access(LPVOID args)
	{
		PARA* p;
		p = (PARA*)args;

		p->session = InternetOpenA("UrlTest", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
		

		if (p->session != NULL)
		{
			p->bS = InternetOpenUrlA(p->session, p->url.c_str(), NULL, 0, INTERNET_FLAG_DONT_CACHE, 0);
			if (p->bS != NULL)
			{
				p->requst = new string();
				BYTE Temp[MAXSIZE];
				ULONG Number = 1;
				while (Number > 0)
				{
					InternetReadFile(p->bS, Temp, MAXSIZE - 1, &Number);
					Temp[Number] = '\0';
					p->requst->append((char*)Temp);
				}
				InternetCloseHandle(p->bS);
				p->bS = NULL;
				p->result = true;
			}
			InternetCloseHandle(p->session);
			p->session = NULL;
		}
	}

	static int urlAccess(const char* url, std::string& request, int timeOutSecs)
	{
		PARA *p1 = new PARA();
		p1->url = url;
		
		DWORD id;
		int result = -1;
		HANDLE hThread = CreateThread(NULL, 0, thread_access, p1, 0, &id);

		if (WaitForSingleObject(hThread,timeOutSecs*1000))
		{
			std::cout << "TIME" << std::endl;
			if (p1->bS != NULL)
			{
				InternetCloseHandle(p1->bS);
			}
			if (p1->session != NULL)
			{
				InternetCloseHandle(p1->session);
			}
		}

		if (p1->result)
		{
			request.append(*(p1->requst));
			result = 1;
		}
		result = 0;

		if (hThread)
		{
			CloseHandle(hThread);
		}
		return result;
	}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章