基于Wininet异步模式实现的HttpClient

      项目在使用Wininet API时一直采用的同步模式,通过开一个线程+等待超时的“假"异步方式来实现非阻塞调用。但是最近突然发现,同步调用InternetOpenUrl在处于阻塞状态时,在某些情况下,通过InternetCloseHandle无法强制InternetOpenUrl立即返回。导致程序退出时开启的线程无法正常退出。排查了很久,未找到问题原因,怀疑这是同步方式本身的bug。所以不得已引入了异步模式。现封装了一个异步读取类CHttpClient,采用Winnet的异步接口进行读取,可以自定义接口超时时间,通过使用异步模式后,很好的避免了上述问题的发生。

class CHttpClient
{
public:
	CHttpClient(void);
	~CHttpClient(void);
public:
	BOOL Open(LPCTSTR lpUrl,int timeout = INFINITE);
	int Read(unsigned char* buffer,int size,int timeout = INFINITE);
	void Close();
};


客户端调用示例代码:

int main(int argc, char *argv[])
{
	CHttpClient httpClient;
	BOOL bRet = httpClient.Open("http://192.168.169.200/stream.php?cam=c0a86b8500",5000);
	if(!bRet)
	{
		return 0;
	}
	unsigned char buffer[4096] = {0};
	while(1)
	{
		int len = httpClient.Read(buffer,sizeof(buffer));
		if(len <= 0)
		{
			break;
		}
	}
	httpClient.Close();
	return 1;
}
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值