我想向ip地址为192.168.2.91服务器发送一条http请求:http://192.168.2.91/axis-cgi/mjpg/video.cgi,获取返回的视频数据。
正确的抓包结果应该是:GET /axis-cgi/mipg/video.cgi HTTP/1.1
而我用以下代码发送的抓包结果却为:GET / HTTP/1.1,也read不到数据。
不知道是不是我组合http包头出现了问题么?第一次使用CInternetSession和CHttpFile,请大侠帮忙检查一下,先谢谢。void GetData()
{
    CInternetSession   sess ;
    sess.SetOption(INTERNET_OPTION_PROXY_PASSWORD,"pass",sizeof("pass"));    
    sess.SetOption(INTERNET_OPTION_USERNAME, "root",strlen("root")+1,0);       DWORD dwFlag = INTERNET_FLAG_TRANSFER_BINARY|INTERNET_FLAG_DONT_CACHE|INTERNET_FLAG_RELOAD ;
    CHttpFile   * pF = (CHttpFile*)sess.OpenURL("http://192.168.2.91", 1, dwFlag); ASSERT(pF);
    if (!pF)
    {
AfxThrowInternetException(1);
    }    CString      str ;
    pF->QueryInfo (HTTP_QUERY_STATUS_CODE, str) ;    // Proxy Authentication Required
    if (str == _T("407") || str != _T("200"))
    {
        //没权限
pF->Close() ;
        delete pF ;
        AfxThrowInternetException(1);
    }    CString strHeaders = "http://192.168.2.91/axis-cgi/mjpg/video.cgi";
    //CString strHeaders = "GET://192.168.2.91/axis-cgi/mjpg/video.cgi"; 使用这个包头请求,发送会阻塞。
    pF->AddRequestHeaders(strHeaders);
    if (!pF->SendRequest(strHeaders, strHeaders.GetLength()))
   {
return ;
   }   char buf[4096];
   int n = 0;
   memset(buf, 0, 4096);
   while((n=pF->Read(buf,sizeof(buf)))>0)//
   {
//保存数据
   }   f.Close();
   pF->Close();
}

解决方案 »

  1.   

    通过HTTP协议来获取服务器的数据,有种简单的方式就是只使用OpenURL()函数。这个函数不需要添加HTTP协议头。。它的参数就是在IE地址栏中的完整的地址。。
      

  2.   

    例如获取本网页的内容,就是CHttpFile  * pFile = (CHttpFile*)sess.OpenURL("http://topic.csdn.net/u/20080620/12/e160e9df-5c12-4b41-a0dd-df3f104000b2.html?seed=299340280"); 
    如果返回的不是NULL,就可以对它ReadString()来得到网页内容。
      

  3.   

    例如获取本网页的内容,就是CHttpFile  * pFile = (CHttpFile*)sess.OpenURL("http://topic.csdn.net/u/20080620/12/e160e9df-5c12-4b41-a0dd-df3f104000b2.html?seed=299340280"); 
    如果返回的不是NULL,就可以对它ReadString()来得到网页内容。
      

  4.   

    CSDN太烂了。第一次发的时候,网络超时,又发了下,结果重发了还限制我回复无语
    言归正传,另一种方法就复杂些。。就是要添加HTTP协议头,连同你要GET或POST的OBJECT,一起发送到服务器。。楼主你的用法错了,,你要是使用OPENURL()方法,就不能再对那个CHTTPFile的指针AddRequestHeaders()了。。这个时候的pFile如果不为空,它里面就已经有你想要的数据了。。
    另一种方法:CInternetSession* m_pSession;
    CHttpConnection* m_pCon;
    m_pCon = m_pSession->GetHttpConnection(HTTP_SERVER, 0, HTTP_SERVER_PORT);
    if (m_pCon != NULL)
    {
            CHttpFile* pFile = NULL;
    try
             {
    pFile = m_pCon->OpenRequest(CHttpConnection::HTTP_VERB_GET, 
    lpszCommand, lpszRefer);
    if (pFile != NULL)
    {
    pFile->AddRequestHeaders(ACCEPT_TYPE);
    pFile->AddRequestHeaders(ACCEPT_LANGUAGE);
    pFile->AddRequestHeaders(ACCEPT_ENCODING);
    pFile->AddRequestHeaders(CONNECTION_TYPE);
    pFile->SendRequest();
    DWORD dwStatusCode = 0;
    pFile->QueryInfoStatusCode(dwStatusCode);
    if (dwStatusCode != 200)
    {
    pFile->Close();
    delete pFile;
    }
    }
            }
    catch (CInternetException *pEx)
    {
    CString szError;
    pEx->GetErrorMessage(szError.GetBuffer(MAX_PATH), MAX_PATH);
    szError.ReleaseBuffer();
    TRACE("SendRequest exception. Error message : %s\n", szError);
    pEx->Delete();
    }
    }匆忙写的例子,很粗糙。AddRequestHeaders()和SendRequest()需要判断返回值的。ACCEPT_LANGUAGE,ACCEPT_ENCODING,CONNECTION_TYPE等等是你抓包分析得到的HTTP头,
    这几个是宏,就代表那些个字符串。。
      

  5.   

    楼上正解。
    你可以做如下修改:
    CHttpFile  * pF = (CHttpFile*)sess.OpenURL("http://192.168.2.91", 1, dwFlag); ASSERT(pF); //改为:
    CHttpFile  * pF = (CHttpFile*)sess.OpenURL("http://192.168.2.91/axis-cgi/mjpg/video.cgi", 1, dwFlag); ASSERT(pF); 然后 ,把下面
        CString strHeaders = "http://192.168.2.91/axis-cgi/mjpg/video.cgi";
        //CString strHeaders = "GET://192.168.2.91/axis-cgi/mjpg/video.cgi"; 使用这个包头请求,发送会阻塞。
        pF->AddRequestHeaders(strHeaders); 
    统统删掉。
      

  6.   

    恩,使用OPENURL()函数的时候,下面的就可以统统不要了