利用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;
}