使用HTTP传输

使用HTTP传输

 

#include <afxinet.h>  
#include <afxsock.h>  
  
//http传输  
DWORD HttpTranslate(  
   int iRequstType, LPCTSTR pstrURL, LPCTSTR strOptions,   
   CStringA &szReturn)  
{  
  DWORD dwError = 0;  
  DWORD dwServiceType;  
  CString strServer;  
  CString strObject;  
  INTERNET_PORT nPort = INTERNET_INVALID_PORT_NUMBER;  
  CString strUsername, strPassword;
      
  //解析URL  
  if(dwError == 0)  
  {  
    if(!AfxParseURLEx(pstrURL, dwServiceType, strServer, strObject, nPort, 
      strUsername, strPassword))  
    {  
      dwError = ERROR_INTERNET_INVALID_URL;  
      ASSERT(FALSE);  
    }  
  }  
    
  //初始化Socket  
  if(dwError == 0)  
  {  
    if(!AfxSocketInit())  
    {  
      dwError = ERROR_INTERNET_TCPIP_NOT_INSTALLED;  
      ASSERT(FALSE);  
    }  
  }  
  
  CInternetSession session;  
  CHttpConnection* pServer = NULL;  
  CHttpFile* pFile = NULL;   
    
  //设置超时时间  
  if(dwError == 0)  
  {  
    if(session.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT, 10000)  
      && session.SetOption(INTERNET_OPTION_SEND_TIMEOUT, 10000)  
      && session.SetOption(INTERNET_OPTION_RECEIVE_TIMEOUT, 20000))  
    {  
    }  
    else  
    {  
      dwError = GetLastError(); //ERROR_INTERNET_INVALID_OPTION;  
    }  
  }  
    
  if(dwError == 0)  
  {  
    try  
    {  
      pServer = session.GetHttpConnection(strServer, nPort);  
      pFile = pServer->OpenRequest(iRequstType, strObject);     
      pFile->AddRequestHeaders(
        _T("Content-Type: application/x-www-form-urlencoded; charset=UTF-8")); //UTF-8 
      pFile->SendRequest(NULL, 0, (LPVOID)strOptions, strOptions? _tcslen(strOptions):0);  
      DWORD dwRet;  
      pFile->QueryInfoStatusCode(dwRet);  
        
      if (dwRet == HTTP_STATUS_OK)  
      {
        CStringA szReadData;
        char szBuff[1025];  
        UINT nRead = 0;  
        while (nRead = pFile->Read(szBuff, 1024))  
        {
          szBuff[nRead] = 0;  
          szReadData += szBuff;  
        }
        
        //UTF8 ---> Unicode
        if(!szReadData.IsEmpty())
        {
          LPCSTR szSrc = (LPCSTR)szReadData;
          int iLen = MultiByteToWideChar(CP_UTF8, 0, szSrc, -1, NULL, 0);
          LPWSTR pwData = new WCHAR [iLen + 1];
          memset(pwData, 0, (iLen+1)*sizeof(WCHAR));
          MultiByteToWideChar(CP_UTF8, 0, szSrc, -1, pwData, iLen);          
          szReturn = pwData;
          delete [] pwData;
        }
      }  
    }  
    catch (CInternetException* pEx)  
    {  
      //catch errors from WinInet  
      dwError = pEx->m_dwError;  
     #ifdef _DEBUG  
      pEx->ReportError();  
     #endif  
      pEx->Delete();  
    }  
  }  
    
  //结束清理  
  {  
    if(pFile)  
    {  
      pFile->Close();  
      delete pFile;  
      pFile = NULL;  
    }  
      
    if(pServer)  
    {  
      pServer->Close();  
      delete pServer;  
      pServer = NULL;  
    }  
      
    session.Close();  
  }  
    
  return dwError;  
}  


 

//测试在百度上搜索pt100

  CStringA szEcho;
  HttpTranslate(CHttpConnection::HTTP_VERB_GET,
    _T("http://baike.baidu.com/search?word=pt100&type=0&pn=0&rn=10&submit=search"),
    NULL, 
    szEcho);
  
  try
  {
    LPCTSTR szFileName = _T("E:\\temp\\t.html");
    CFile file(szFileName, CFile::modeCreate|CFile::modeWrite);
    file.Write((LPCTSTR)szEcho, szEcho.GetLength() * sizeof(TCHAR));
    file.Close();
    ShellExecute(NULL, _T("open"), szFileName, NULL, NULL, SW_SHOWNORMAL);
  }
  catch (CFileException* e)
  {
    e->ReportError();
    e->Delete();
  }


 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值