我想向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();
}
正确的抓包结果应该是: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();
}
如果返回的不是NULL,就可以对它ReadString()来得到网页内容。
如果返回的不是NULL,就可以对它ReadString()来得到网页内容。
言归正传,另一种方法就复杂些。。就是要添加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头,
这几个是宏,就代表那些个字符串。。
你可以做如下修改:
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);
统统删掉。