先用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

解决方案 »

  1.   

    通过在头中加入Connection命令试试
    要保持连接不断掉应该可以了吧不过最好用Sokcet自已发送Http请求,其中使用Rang命令,格式如下:
    Rang: <开始位置> - <长度(字节数)>
      

  2.   

    是不是用HttpOpenRequest,再HttpAddRequestHeaders?
    怎么写,清说详细点
    其实就是编个简单的蚂蚁
      

  3.   

    不是,是用Win Socket自已进行处理,不使用HttpOpenRequest什么的
    你用Win Socket建自一条TCP连接,然后发送请救到服务器,关于HTTP协议
    的详细内容可以查看RFC2616
      

  4.   

    http://www.vckbase.com/document/viewdoc.asp?id=448
      

  5.   

    呵呵~~
    问对人了:)
    我截取 了代码中的一部分 
    你看看
    主要思路是检查 状态码: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 ;
    }
    }
      

  6.   

    大哥,我只要http多点下载,不要转向的!?
      

  7.   

    另外ce不能用internetsession有点问题,只能internetopen之类的api
      

  8.   

    呵呵~~
    对不起 看错了:)
    想实现断点续传是不是:)
    用 HttpAddRequestHeaders 向服务器发出 Range:bytes= X - Y  X是想下文件的开始处
    Y是文件结束处:)呵呵:)
    然后读就行了
    如果是
    Range:bytes= X- 
    那么就是重 X 处 读到文件尾:)
      

  9.   

    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);
    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
    而我有这个文件?晕
      

  10.   

    是不是这样
    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
      

  11.   

    设置超时
    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));
    好像没用?
      

  12.   

    rang没用?
    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不起作用?错在哪,急啊
      

  13.   

    怎么回事??
    Range: bytes=起始位置 - 终止位置你这一行
    strRang.Format(_T("%sRang:bytes= [%d] - [%d]"),strHead,6,9);
    怎么用了Rang,还给数字加上了中括号??
      

  14.   

    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("%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?
      

  15.   

    多谢你给的分。
    不过,你最后那段程序我copy下来试过了,下载正常,一点问题都没有!