问题背景:
       在VC++下面开发访问HTTP页面,最简单的方法莫过于下面这样的调用方式,这样写完程序测试OK,但是上线运行一段时间,程序时不时给你弹出一个什么错误,点击确定之后程序异常退出,这是为什么呢,仔细查看这一段代码,我们可以看出代码中没有设定HTTP访问超时的时间,问题可能就出在这,因为我将程序这段代码屏蔽掉运行没有问题。
       因此我在网上查找相关信息,大部分人说Windows这个OpenURL函数就不能设定时间,迫于无奈我信了,只能想其他解决办法,这时找到了CURL开源代码,据说伟大的苹果也在使用这个开源代码,于是决定修改代码使用CURL,详情请见第二部分具体解决办法:

[cpp] 

  1. char* headers="Accept:*/*\r\nAccept-Language:zh-cn\r\nContent-type:text/html;charset=ANSI\r\nUser-Agent:ImportFileClient\r\n";  

  2.     CHttpFile * pFile = (CHttpFile *)m_pInternetSession->OpenURL(strURL, 1, INTERNET_FLAG_TRANSFER_ASCII||INTERNET_FLAG_RELOAD, headers, strlen(headers));  

  3.     DWORD dwStatusCode;  

  4.     pFile->QueryInfoStatusCode(dwStatusCode);  

  5.     if (dwStatusCode == HTTP_STATUS_OK)  

  6.     {  

  7.         CFile file(strSavePath, CFile::modeCreate | CFile::modeWrite);  

  8.         CString szData;//, szAllData;  

  9.         while (pFile->ReadString(szData))  

  10.         {  

  11.             //把读取来的utf-8转成ansi  

  12.         int wcsLen = ::MultiByteToWideChar(CP_UTF8, NULL, szData, szData.GetLength(), NULL, 0);  

  13.             wchar_t * wszString = new wchar_t[wcsLen+1];  

  14.             ::MultiByteToWideChar(CP_UTF8, NULL, szData, szData.GetLength(), wszString, wcsLen);  

  15.             wszString[wcsLen] = '\0';  

  16.             int ansiLen = ::WideCharToMultiByte(CP_ACP, NULL, wszString, wcsLen, NULL, 0, NULL, NULL);  

  17.             char * szAnsi = new char[ansiLen + 1];  

  18.             ::WideCharToMultiByte(CP_ACP, NULL, wszString, wcsLen, szAnsi, ansiLen, NULL, NULL);  

  19.           szAnsi[ansiLen] = '\0';  

  20.             //写进文件  

  21.             file.Write(szAnsi, ansiLen * sizeof(char));  

  22.             delete wszString;  

  23.           delete szAnsi;  

  24.         }  

  25.         pFile->Close();  

  26.         file.Close();  

  27.     }  


具体解决办法:
        CURL环境部署及简单测试可以参考:http://blog.csdn.net/heavenopener/article/details/5424857
由于上面的例子仍然设置访问超时时间,因此代码需要重新修改一下,我重新封装一个头文件及对应的CPP文件,具体请见第三部分——部分源代码
       调用例子:

[cpp] 

  1. #include "UrlPlus.h"  

  2. int main(int argc, char* argv[])  

  3. {  

  4.     CString strRet = get("http://202.102.92.68:8000/db.aspx?protype=user_status_json&h=18929552551");  

  5.     printf("%s",strRet.GetBuffer(0));  

  6.     return 0;  

  7. }  


部分源码:

UrlPlus.h

[cpp] 

  1. #include <stdio.h>  

  2. #include <afx.h>  

  3. #include <curl/curl.h>  

  4. #include <curl/easy.h>  

  5.   

  6. #pragma comment(lib, "curllib.lib")  

  7.   

  8. extern char szbuffer[10240];  

  9. extern char szErrorBuffer[CURL_ERROR_SIZE];  

  10. int DownloadData(char *data, size_t size, size_t nmemb, char *writerData);  

  11. CString get(CString strURL);  

  12. CString post(CString strURL, CString strContent);  


UrlPlus.cpp

[cpp] 

  1. #include "StdAfx.h"  

  2. #include "UrlPlus.h"  

  3.   

  4. char szbuffer[10240];  

  5. char szErrorBuffer[CURL_ERROR_SIZE];   

  6.   

  7. int DownloadData(char *data, size_t size, size_t nmemb, char *writerData)  

  8. {  

  9.     if (writerData == NULL)  

  10.     {  

  11.         return 0;  

  12.     }  

  13.     int len = size*nmemb;  

  14.     strcat(writerData,data);  

  15.     return len;  

  16. }  

  17.   

  18. CString get(CString strURL)  

  19. {  

  20.     memset(szbuffer,0x0,sizeof(szbuffer));  

  21.     CURL *pCurl = NULL;  

  22.     pCurl = curl_easy_init();   

  23.     if(pCurl == NULL)     

  24.     {  

  25.         //Print Error Info    

  26.     }  

  27.   

  28.     curl_easy_setopt(pCurl, CURLOPT_ERRORBUFFER, szErrorBuffer);  

  29.     curl_easy_setopt(pCurl, CURLOPT_TIMEOUT, 300);  

  30.     curl_easy_setopt(pCurl, CURLOPT_URL, strURL.GetBuffer(0));   

  31.     curl_easy_setopt(pCurl, CURLOPT_WRITEFUNCTION, &DownloadData);   

  32.     curl_easy_setopt(pCurl, CURLOPT_WRITEDATA, szbuffer);   

  33.     curl_easy_setopt(pCurl, CURLOPT_HEADER, 0);  

  34.       

  35.     CURLcode code = curl_easy_perform(pCurl);  

  36.     if(code != CURLE_OK)  

  37.     {  

  38.         //curl_easy_perform failed    

  39.     }  

  40.   

  41.     if (pCurl)   

  42.     {   

  43.         curl_easy_cleanup(pCurl);   

  44.         pCurl = NULL;   

  45.     }  

  46.     return szbuffer;  

  47. }  

  48.   

  49. CString post(CString strURL, CString strContent)  

  50. {     

  51.     memset(szbuffer,0x0,sizeof(szbuffer));  

  52.     CURL *pCurl = NULL;  

  53.     pCurl = curl_easy_init();   

  54.     if(pCurl == NULL)     

  55.     {  

  56.         //Print Error Info    

  57.     }  

  58.   

  59.     curl_easy_setopt(pCurl, CURLOPT_ERRORBUFFER, szErrorBuffer);  

  60.     curl_easy_setopt(pCurl, CURLOPT_TIMEOUT, 300);  

  61.     curl_easy_setopt(pCurl, CURLOPT_URL, strURL.GetBuffer(0));   

  62.     curl_easy_setopt(pCurl, CURLOPT_WRITEFUNCTION, &DownloadData);   

  63.     curl_easy_setopt(pCurl, CURLOPT_WRITEDATA, szbuffer);   

  64.     curl_easy_setopt(pCurl, CURLOPT_HEADER, 0);  

  65.       

  66.     curl_easy_setopt(pCurl, CURLOPT_POST, 1 );  

  67.     curl_easy_setopt(pCurl, CURLOPT_POSTFIELDS, strContent.GetBuffer(0));     

  68.     CURLcode code = curl_easy_perform(pCurl);  

  69.     if(code != CURLE_OK)  

  70.     {  

  71.         //curl_easy_perform failed    

  72.     }  

  73.       

  74.     if (pCurl)   

  75.     {   

  76.         curl_easy_cleanup(pCurl);   

  77.         pCurl = NULL;   

  78.     }  

  79.     return szbuffer;  

  80. }  

上述代码都经过自己测试,如有什么问题,欢迎批评指正,非常的感谢~~