VC使用HTTP协议下载文件


//
//功能:从网上下载文件并保存到本地
/
int CMyFun::InternetGetFile(CString szUrl, CString szFileName)
{
    szUrl.Format("%s",_T("http://www.houg.cn/Download/houggame.exe"));

    DWORD dwFlags;
    //返回本地系统的网络连接状态。
    /*
    INTERNET_CONNECTION_LAN          局域网
    INTERNET_CONNECTION_MODEM        拨号上网
    INTERNET_CONNECTION_PROXY        代理
    INTERNET_CONNECTION_MODEM_BUSY   代理被占用
    INTERNET_CONNECTION_CONFIGURED   虽然可以联网,但当前不可用
    INTERNET_CONNECTION_OFFLINE    离线
    INTERNET_RAS_INSTALLED      RAS安装
    */
    bool bInternet=InternetGetConnectedState(&dwFlags, 0);
    if (!bInternet)
    {
        AfxMessageBox(_T("当前计算机连接公网失败"));
    }
    //这个必须得这样写
    //BOOL bConnected = InternetCheckConnection(szUrl, FLAG_ICC_FORCE_CONNECTION, 0);
    BOOL bConnected = InternetCheckConnection(_T("http://www.houg.cn"), FLAG_ICC_FORCE_CONNECTION, 0);
    if (!bConnected)
    {
        AfxMessageBox(_T("服务器未开启"));
    }
    /*
    InternetOpen:
    函数作用:初始化一个应用程序,以使用WinINet 函数。
    参数一:指向一个空结束的字符串,该字符串指定的应用程序或实体调用WinInet函数的名称。使用此名称作为用户代理的HTTP协议。
    */
    CHAR strAgent[64];
    memset(strAgent,0,sizeof(strAgent));
    sprintf(strAgent, "Agent%ld", timeGetTime());
    HINTERNET hOpen;
    if(!(dwFlags & INTERNET_CONNECTION_PROXY))
        hOpen = InternetOpen(strAgent, INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY, NULL, NULL, 0);
    else
        hOpen = InternetOpen(strAgent, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
    if(!hOpen)
    {
        return -1;
    }

    DWORD dwSize;
    CHAR   szHead[] = "Accept: */*\r\n\r\n";
    VOID* szTemp[16384];
    HINTERNET  hConnect;
    CFile file;
    /*InternetOpenUrl:
    函数作用:通过一个完整的FTP,Gopher或HTTP网址打开一个资源。
    */
    if ( !(hConnect = InternetOpenUrl( hOpen, szUrl, szHead,
         lstrlenA (szHead), INTERNET_FLAG_DONT_CACHE | INTERNET_FLAG_PRAGMA_NOCACHE | INTERNET_FLAG_RELOAD, 0)))
    {
        InternetCloseHandle(hOpen);
        return -1;
    }
    if  (file.Open(szFileName,CFile::modeWrite|CFile::modeCreate)==FALSE )
    {
      return -1;
    }

    DWORD dwByteToRead = 0;
    DWORD dwSizeOfRq = 4;
    DWORD dwBytes = 0;
    /*HttpQueryInfo函数:
    服务器会把该文件信息返回给你,其中包括大小啊、更新时间啊(如果有更新时间的话)、类型啊等等
    */
    if (!HttpQueryInfo(hConnect, HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER,
                  (LPVOID)&dwByteToRead, &dwSizeOfRq, NULL))
    {
        dwByteToRead = 0;
    }


    memset(szTemp,0,sizeof(szTemp));
    do
    {
        if (!InternetReadFile (hConnect, szTemp, 16384,  &dwSize))//每次传16KB
        {
            file.Close();
            return -1;
        }
        if (dwSize==0)
            break;
        else
            file.Write(szTemp,dwSize);
        
    }while (TRUE);

    file.Close();
    InternetCloseHandle(hConnect);
    InternetCloseHandle(hOpen);

    return 0;
}
### 回答1: VC是指Visual C++,而http协议是一种用于传输超文本的协议。在VC使用http协议下载文件可以通过以下步骤实现。 首先,需要使用VC提供的网络编程库,如WinINet或WinHTTP。这些库提供了一些函数和类,用于与服务器进行http通信。 其次,需要创建一个http会话并与服务器建立连接。这可以通过调用相关函数来实现,如InternetOpen、InternetConnect等。 然后,要使用http协议发送下载文件的请求。可以使用HTTP GET方法向服务器发送请求,并指定要下载文件的URL。这可以通过调用相关函数,如HttpOpenRequest、HttpSendRequest等来实现。 接下来,需要接收服务器的响应并获取待下载文件的信息,如文件大小、文件类型等。可以使用相关函数如HttpQueryInfo等来实现。 然后,创建本地文件并准备接收服务器发送的文件内容。可以使用相关函数如CreateFile、WriteFile等来实现。 最后,从服务器接收文件内容并将其写入本地文件中。这可以通过调用相关函数如InternetReadFile等来实现,直到接收完整个文件。 需要注意的是,在下载过程中需要严密地处理各种可能的错误和异常情况,以确保下载过程的稳定性和可靠性。 以上是使用VChttp协议下载文件的大致步骤,具体的实现细节可以根据具体情况和需求进行调整和完善。 ### 回答2: VC(Virtual Channel)是在计算机网络中用于传输数据的通道,它是一种在网络服务器和客户端之间建立连接并传输数据的协议。HTTP(Hypertext Transfer Protocol)是一种用于在网络上传输超文本的协议。 在使用VC协议下载文件时,通常会结合HTTP协议来完成文件的传输。具体的步骤如下: 1. 客户端向服务器发送HTTP请求,请求下载文件的URL。 2. 服务器接收到请求后,通过VC协议建立与客户端的连接,并开始传输文件。 3. 服务器根据请求的URL找到对应的文件,并以HTTP响应的形式返回给客户端。 4. 客户端接收到服务器的响应后,开始通过VC协议接收文件数据。 5. 服务器通过VC协议将文件数据分包发送给客户端,客户端通过接收这些包来获取完整的文件数据。 6. 当服务器传输完整个文件后,关闭与客户端的连接。 通过以上步骤,客户端就能够使用VC协议下载HTTP协议中请求的文件VC协议通过在网络上建立可靠的连接来确保数据的完整性和准确性。而HTTP协议则负责处理客户端和服务器之间的通信,并提供对文件的请求和响应。 总结起来,通过VCHTTP协议的结合,实现了在网络上下载文件的功能,使得文件的传输更加可靠和高效。 ### 回答3: VC是Visual C++的简称,是一种面向对象的编程语言。VC可以使用HTTP协议下载文件,以下是下载文件的步骤: 1. 创建一个Win32控制台应用程序的工程,打开VC开发环境。 2. 在代码中引入必要的头文件,如 <winhttp.h> 和 <iostream>。 3. 使用WinHTTP库进行HTTP请求,可以使用WinHttpOpen函数初始化HTTP会话,然后使用WinHttpOpenRequest函数创建HTTP请求。 4. 设置HTTP请求的参数,包括请求的method(GET或POST),URL、头部信息等。 5. 发送HTTP请求,使用WinHttpSendRequest函数发送请求到服务器。 6. 接收HTTP响应,使用WinHttpReceiveResponse函数接收服务器的响应。 7. 判断响应状态,使用WinHttpQueryHeaders函数查询响应头部信息,判断请求是否成功。 8. 创建本地文件使用CreateFile函数创建保存文件的本地文件。 9. 读取响应数据,使用WinHttpReadData函数持续读取服务器返回的数据,并写入本地文件。 10. 关闭HTTP请求和会话,使用WinHttpCloseHandle函数关闭请求和会话句柄。 11. 关闭本地文件使用CloseHandle函数关闭本地文件句柄。 以上是使用VC编写的HTTP协议下载文件的基本过程。在实际应用中,还可以添加错误处理、进度显示等功能,以提高用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值