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