先用InternetOpenUrl打开一个http文件,现在要多线程下载,就要对打开的文件进行定位,设
hConnect=InternetOpenUrl(hOpen,strRemote,strHead,strHead.GetLength(),INTERNET_FLAG_DONT_CACHE | INTERNET_FLAG_PRAGMA_NOCACHE | INTERNET_FLAG_RELOAD,0);
请问如何对hConnect定位,另外有无类似网络蚂蚁一样的代码,参考看一下,谢谢。
总之一句话对InternetOpenUrl的文件定位,我在ce下只能用api
hConnect=InternetOpenUrl(hOpen,strRemote,strHead,strHead.GetLength(),INTERNET_FLAG_DONT_CACHE | INTERNET_FLAG_PRAGMA_NOCACHE | INTERNET_FLAG_RELOAD,0);
请问如何对hConnect定位,另外有无类似网络蚂蚁一样的代码,参考看一下,谢谢。
总之一句话对InternetOpenUrl的文件定位,我在ce下只能用api
要保持连接不断掉应该可以了吧不过最好用Sokcet自已发送Http请求,其中使用Rang命令,格式如下:
Rang: <开始位置> - <长度(字节数)>
怎么写,清说详细点
其实就是编个简单的蚂蚁
你用Win Socket建自一条TCP连接,然后发送请救到服务器,关于HTTP协议
的详细内容可以查看RFC2616
问对人了:)
我截取 了代码中的一部分
你看看
主要思路是检查 状态码:if(dwRet == HTTP_STATUS_MOVED || dwRet == HTTP_STATUS_REDIRECT ||
dwRet == HTTP_STATUS_REDIRECT_METHOD)
说明 链接被转向
wininet.h这样定义:
#define HTTP_STATUS_AMBIGUOUS 300 // server couldn't decide what to return
#define HTTP_STATUS_MOVED 301 // object permanently moved
#define HTTP_STATUS_REDIRECT 302 // object temporarily moved
#define HTTP_STATUS_REDIRECT_METHOD 303 // redirection w/ new access method
#define HTTP_STATUS_NOT_MODIFIED 304 // if-modified-since was not modified
m_hSession = ::InternetOpen("IE5",
bUseProxy?INTERNET_OPEN_TYPE_PROXY:INTERNET_OPEN_TYPE_PRECONFIG,
bUseProxy?(LPCTSTR)strProxyName:(LPCTSTR)NULL,
NULL,0); if(m_hSession != NULL)
{
DWORD dwTimeout = 4000;
::InternetSetOption(m_hSession,INTERNET_OPTION_CONNECT_TIMEOUT,
&dwTimeout,sizeof(dwTimeout));
}
else
return CInet::BAD_URL;
///////////////////////////////////////////////
try
{
// 初始化返回数据计数
nLen = 0;
hConnect = ::InternetConnect(m_hSession,strServer,
INTERNET_INVALID_PORT_NUMBER,
strUser,
strPassword,
INTERNET_SERVICE_HTTP,
0,
0) ;
strObject = strObject.SpanExcluding("#");
const char *szTempX[2] = {szHeaders,NULL};
hURL = ::HttpOpenRequest(hConnect,"GET",strObject,
HTTP_VERSION,NULL,
szTempX,dwHttpRequestFlags,0) ; // 发送请求Send the "get" request
::HttpSendRequest(hURL,NULL,0,0,0); // 如果失败,则返回 If it failed, then get out now
if(hURL == NULL)
return(CInet::BAD_URL);
// 检查返回码Check the return code
DWORD dwRet, dwLen;
char szTemp[500];
dwLen = sizeof(szTemp);
::HttpQueryInfo(hURL,HTTP_QUERY_STATUS_CODE,szTemp,&dwLen,NULL);
dwRet = (DWORD) atoi(szTemp);
dwLen = sizeof(szTemp);
m_dwRet = dwRet; // 需要链接重定向该页面Was this page redirected?
if(dwRet == HTTP_STATUS_MOVED || dwRet == HTTP_STATUS_REDIRECT ||
dwRet == HTTP_STATUS_REDIRECT_METHOD)
{
// 获得新的地址 Yep...get the new base location
CString strNewLocation;
::HttpQueryInfo(hURL,HTTP_QUERY_LOCATION,NULL,&dwLen,0);
::HttpQueryInfo(hURL,HTTP_QUERY_LOCATION,
strNewLocation.GetBufferSetLength(dwLen),
&dwLen,0);
strNewLocation.ReleaseBuffer(dwLen);
return ;
}
}
对不起 看错了:)
想实现断点续传是不是:)
用 HttpAddRequestHeaders 向服务器发出 Range:bytes= X - Y X是想下文件的开始处
Y是文件结束处:)呵呵:)
然后读就行了
如果是
Range:bytes= X-
那么就是重 X 处 读到文件尾:)
CString strServer="192.168.0.143";
CString strHead=CString((LPCTSTR)IDS_HTTP_HEAD);
HINTERNET hOpen=InternetOpen(strHead,INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);
HINTERNET hConnect=InternetConnect(hOpen,strServer,80,NULL,NULL,INTERNET_SERVICE_HTTP,NULL,NULL);
strHead.Format(_T("%sRang:[%d]-[%d]"),strHead,6,9);
HINTERNET hRequest=HttpOpenRequest(hConnect,NULL,strRemote, _T("HTTP/1.1"),NULL,NULL,INTERNET_FLAG_KEEP_CONNECTION,NULL);
if(HttpSendRequest(hRequest,strHead,strHead.GetLength(),NULL,NULL))
{
TCHAR buff[4];
DWORD dwLength,dwBytesRead,dwSizeOfRq=4;
CString strLength;
if (HttpQueryInfo(hRequest, HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER,(LPVOID)&dwLength, &dwSizeOfRq, NULL))
{
strLength.Format(_T("%d"),dwLength);
AfxMessageBox(strLength,NULL,NULL);
InternetReadFile(hConnect,buff,4,&dwBytesRead);
AfxMessageBox(buff,NULL,NULL);
}
AfxMessageBox(_T("成功"),NULL,NULL);
}
else
AfxMessageBox(_T("失败"),NULL,NULL);
返回状态404
而我有这个文件?晕
CString strRemote="http://192.168.0.143/update.lst";
CString strServer="192.168.0.143";
CString strHead=CString((LPCTSTR)IDS_HTTP_HEAD);
HINTERNET hOpen=InternetOpen(strHead,INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);
HINTERNET hConnect=InternetConnect(hOpen,strServer,80,NULL,NULL,INTERNET_SERVICE_HTTP,NULL,NULL);
CString strRang;
strRang.Format(_T("%sRang:bytes= [%d] - [%d]"),strHead,6,9);
HINTERNET hRequest=HttpOpenRequest(hConnect,NULL,strRemote, _T("HTTP/1.1"),NULL,NULL,INTERNET_FLAG_KEEP_CONNECTION,NULL);
HttpAddRequestHeaders(hRequest,strRang,strRang.GetLength(),HTTP_ADDREQ_FLAG_ADD);
if(HttpSendRequest(hRequest,strRang,strRang.GetLength(),NULL,NULL))
{
TCHAR buff[4];
DWORD dwLength,dwBytesRead,dwSizeOfRq=4;
CString strLength;
if (HttpQueryInfo(hRequest, HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER,(LPVOID)&dwLength, &dwSizeOfRq, NULL))
{
}
可还是404.
其中IDS_HTTP_HEAD=Accept: */*\r\nUser-Agent: AutoUpdate\r\n
HINTERNET hConnect=InternetConnect(hOpen,strServer,80,NULL,NULL,INTERNET_SERVICE_HTTP,NULL,NULL);
DWORD dwTimeout = 4000;
InternetSetOption(hConnect,INTERNET_OPTION_CONNECT_TIMEOUT ,&dwTimeout,sizeof(dwTimeout));
好像没用?
CString strRemote="http://192.168.0.143/update.lst";
CString strServer="192.168.0.143";
CString strObject="/update.lst";
CString strHead;
strHead.LoadString(IDS_HTTP_HEAD);
HINTERNET hOpen=InternetOpen(strHead,INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);
HINTERNET hConnect=InternetConnect(hOpen,strServer,80,NULL,NULL,INTERNET_SERVICE_HTTP,NULL,NULL);
DWORD dwTimeout = 4000;
InternetSetOption(hConnect,INTERNET_OPTION_CONNECT_TIMEOUT ,&dwTimeout,sizeof(dwTimeout));
CString strRang;
DWORD dwLength=0,dwSizeOfRq=5,dwState,dwRead;
strRang.Format(_T("%sRang:bytes= [%d] - [%d]"),strHead,6,9);
strHead.Format(_T("%s%s"),strHead,strRang);
HINTERNET hRequest=HttpOpenRequest(hConnect,NULL,strObject, _T("HTTP/1.1"),NULL,NULL,INTERNET_FLAG_KEEP_CONNECTION,NULL);
HttpAddRequestHeaders(hRequest,strHead,strHead.GetLength(),HTTP_ADDREQ_FLAG_ADD );
CFile myFile(_T("\\test.ini"),CFile::modeCreate|CFile::modeWrite|CFile::typeBinary );
BYTE buff[4];
if(HttpSendRequest(hRequest,strHead,strHead.GetLength(),NULL,NULL))
{
HttpQueryInfo(hRequest,HTTP_QUERY_RANGE|HTTP_QUERY_FLAG_NUMBER,(LPVOID)&dwLength,&dwSizeOfRq,NULL);
CString msg;
InternetReadFile(hRequest,buff,4,&dwRead);
myFile.Write(buff,4);
myFile.Close();
}
else
{
CString msg;
msg.Format(_T("错误%d"),GetLastError());
AfxMessageBox(msg,NULL,NULL);
}
文件update.lst"123456789"
原来意思是6789
可是却是1234说明rang不起作用?错在哪,急啊
Range: bytes=起始位置 - 终止位置你这一行
strRang.Format(_T("%sRang:bytes= [%d] - [%d]"),strHead,6,9);
怎么用了Rang,还给数字加上了中括号??
CString strServer="192.168.0.143";
CString strObject="/update.lst";
CString strHead;
strHead.LoadString(IDS_HTTP_HEAD);
HINTERNET hOpen=InternetOpen(strHead,INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);
HINTERNET hConnect=InternetConnect(hOpen,strServer,80,NULL,NULL,INTERNET_SERVICE_HTTP,NULL,NULL);
DWORD dwTimeout = 4000;
InternetSetOption(hConnect,INTERNET_OPTION_CONNECT_TIMEOUT ,&dwTimeout,sizeof(dwTimeout));
CString strRang;
DWORD dwLength=0,dwSizeOfRq=5,dwState,dwRead;
strRang.Format(_T("%sRange:bytes= %d - %d"),strHead,6,9);
strHead.Format(_T("%s%s"),strHead,strRang);
HINTERNET hRequest=HttpOpenRequest(hConnect,NULL,strObject, _T("HTTP/1.1"),NULL,NULL,INTERNET_FLAG_KEEP_CONNECTION,NULL);
HttpAddRequestHeaders(hRequest,strHead,strHead.GetLength(),HTTP_ADDREQ_FLAG_ADD );
CFile myFile(_T("\\test.ini"),CFile::modeCreate|CFile::modeWrite|CFile::typeBinary );
BYTE buff[4];
if(HttpSendRequest(hRequest,strHead,strHead.GetLength(),NULL,NULL))
{
HttpQueryInfo(hRequest,HTTP_QUERY_RANGE|HTTP_QUERY_FLAG_NUMBER,(LPVOID)&dwLength,&dwSizeOfRq,NULL);
CString msg;
InternetReadFile(hRequest,buff,4,&dwRead);
myFile.Write(buff,4);
myFile.Close();
}
else
{
CString msg;
msg.Format(_T("错误%d"),GetLastError());
AfxMessageBox(msg,NULL,NULL);
}
update.lst:123456789
写出来1234不是6789?
不过,你最后那段程序我copy下来试过了,下载正常,一点问题都没有!