项目在使用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;
}