wininet InternetOpenUrlA 设置访问超时

10 篇文章 0 订阅

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


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值