首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

【高分】关于利用wininet进行网络编程的有关问题

2012-03-31 
【高分求助】关于利用wininet进行网络编程的问题。看了一些关于网络编程的简单资料以后决定自己尝试利用winin

【高分求助】关于利用wininet进行网络编程的问题。
看了一些关于网络编程的简单资料以后决定自己尝试利用wininet进行文件下载的编程,首先找了一个msdn上的例子,cpoy下来后,边分析便尝试,但是发现获取下载文件的大小始终不对,不知道为什么?具体代码如下:

C/C++ code
 
void __fastcall TForm1::DoOnStatusText(AnsiString Text)//信息提示
{
    Memo1->Lines->Add(Text);
}
//---------------------------------------
void __fastcall TForm1::ParseURL(AnsiString FURL)//地址解析
{
    AnsiString URL= FURL;
    int i=URL.Pos("http://");
    if(i>0)
    {
        URL.Delete(1, 7);
    }
    i=URL.Pos("/");
    FHostName = URL.SubString(1, i-1);
    FDownPath = URL.SubString(i, URL.Length());
}
//---------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)//下载
{
    ParseURL("http://www.26wz.com/ww_music/稻香周杰伦.MP3");
    try
    {
        //建立会话
        HINTERNET hSession = InternetOpen("WinInet Progress Sample",
                                          INTERNET_OPEN_TYPE_PRECONFIG,
                                          NULL,
                                          NULL,
                                          0);
        if( hSession == NULL)throw(Exception("Error:InternetOpen"));
        DoOnStatusText("ok:InterOpen");
        //建立连接
        HINTERNET hConnection = InternetConnect(hSession,
                                                FHostName.c_str(),  // Server
                                                INTERNET_DEFAULT_HTTP_PORT,
                                                NULL,    // Username
                                                NULL,    // Password
                                                INTERNET_SERVICE_HTTP,
                                                0,        // Synchronous
                                                NULL);    // No Context
        if( hConnection == NULL)throw(Exception("Error:InternetConnect"));
        DoOnStatusText("ok:InternetConnect");
        //初使化下载请求
        HINTERNET hRequest = HttpOpenRequest(hConnection,
                                            "GET",


                                            FDownPath.c_str(),
                                            NULL,    // Default HTTP Version
                                            NULL,    // No Referer
                                            (const char**)"*/*\0", // Accept
                                                                    // anything
                                            0,      // Flags
                                            NULL);  // No Context
        if( hRequest == NULL)throw(Exception("Error:HttpOpenRequest"));
        DoOnStatusText("ok:HttpOpenRequest");
        //发送下载请求
        HttpSendRequest(hRequest,
                        NULL,    // No extra headers
                        0,      // Header length
                        NULL,    // No Body
                        0);      // Body length
        DoOnStatusText("ok:HttpSendRequest");
        //获取文件大小
        DWORD dwContentLen;
        DWORD dwBufLen = sizeof(dwContentLen);
        bool RetQueryInfo = HttpQueryInfo(hRequest,
                          HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER,
                          (LPVOID)&dwContentLen,
                          &dwBufLen,
                          0);
        if( RetQueryInfo == false)throw(Exception("Error:HttpQueryInfo"));
        DoOnStatusText("ok:HttpQueryInfo");
        AnsiString msg = "filesize:" + AnsiString(dwContentLen);
        DoOnStatusText(msg);
    }
    catch(Exception &exception)
    {
        DoOnStatusText(exception.Message);
    }
}


由于出错位置在获取文件大小位置,所以后面的下载文件的部分就不贴出来了。
以上代码编译运行后,点下载按钮,信息提示框中得到的文件大小只有20,而实际文件大小有5,425,364 字节,不管怎么算都和20没联系...
望高手指正!谢谢!

[解决办法]
BCB版人气确实不太高啊,偶冒着被老板BS的危险帮楼主试了一下:建议用InternetOpenUrl直接处理整个的URL,它更有才,比我们自己分解URL好多了。
C/C++ code
void __fastcall TForm1::Button1Click(TObject *Sender){    try    {        //建立会话        HINTERNET hSession = InternetOpen("WinInet Progress Sample",                                          INTERNET_OPEN_TYPE_PRECONFIG,                                          NULL,                                          NULL,                                          0);        if( hSession == NULL)throw(Exception("Error:InternetOpen"));        DoOnStatusText("ok:InterOpen");        HINTERNET hRequest = InternetOpenUrl(hSession, "http://www.26wz.com/ww_music/稻香周杰伦.MP3",            NULL, 0, INTERNET_FLAG_RELOAD, 0);        if( hRequest == NULL)throw(Exception("Error:HttpOpenRequest"));        DoOnStatusText("ok:HttpOpenRequest");        //获取文件大小        DWORD dwContentLen;        DWORD dwBufLen = sizeof(dwContentLen);        bool RetQueryInfo = HttpQueryInfo(hRequest,                          HTTP_QUERY_CONTENT_LENGTH|HTTP_QUERY_FLAG_NUMBER,                          &dwContentLen,                          &dwBufLen,                          0);        if( RetQueryInfo == false)throw(Exception("Error:HttpQueryInfo"));        DoOnStatusText("ok:HttpQueryInfo");        AnsiString msg = "filesize:" + AnsiString(dwContentLen);        DoOnStatusText(msg);    }    catch(Exception &exception)    {        DoOnStatusText(exception.Message);    }} 


[解决办法]
奇怪,楼主上面那段代码俺没发现问题呢?

毛毛,上面那套Wininet函数应该也是可以的呀!
[解决办法]
我也不知道,我在这里试的时候也得不到正确的大小,估计可能是HttpOpenRequest这步有什么小动作不正确

热点排行