C / C ++ - 如何从网络上逐字节下载(如文件流)?

时间:2015-05-23 18:33:56

标签: c++ c url download stream

我在C和C ++中构建一个简单的下载和文件传输管理器,支持暂停和恢复操作。 我寻找一种从给定的URL逐字节下载的方法,但我能找到的只是对libcurl等外部库的引用。我不想要外部库,我想以类似的方式手动读取和写入字节,用于仅使用C / C ++本机库读取和写入文件的字节(如C ++中的ifstream,以及C中的fopen) 。 我需要的伪代码是:

void download(file, url) {
    file.open();
    url.open();
    set_active(true);
    while( ! pause() ) {
        bytes_read = url.read(byte_array);
        if(bytes_read < 1)
            break;
        file.write(byte_array, bytes_read);
    }
    url.close();
    file.close();
    set_active(false);
}

伪代码如何在C和C ++中工作?

编辑:我不想要外部库,只是为了学习这两种语言及其本地库的功能和限制。

编辑2:结论:这两种语言都没有对HTTP操作的原生支持,因此我必须在使用第三方库或从头开始编写HTTP(和其他几种协议)实现之间做出选择,这是不可靠的。感谢。

2 个答案:

答案 0 :(得分:1)

如果使用GTK,您应该使用libcurl或其他HTTP客户端库(例如libsoup)。如果您需要HTTP服务器支持,可以找到它的库,例如libonion

您可能还会考虑POCOQt5框架,它们都有HTTP内容。

如果您不想使用任何此类HTTP 3 rd 方库,则需要自行重新实施HTTP。这可能很复杂(以及几个月或几年的工作),因为HTTP规范是几百页!处理一些简单的GET请求很容易,但处理所有HTTP规范很难。

您可以尝试实现可能某些案例中工作的HTTP的子集,但您很容易找到HTTP服务器或客户端需要更多的HTTP,....而且你的实现将比现有的HTTP库更脆弱和错误......

答案 1 :(得分:1)

注意到您编辑的要求,您不需要外部库。但这里是我在MSVC中编写的程序的摘录,用于从Windows程序下载文件。

// Windows Header Files:
#include <windows.h>
#include <wininet.h>

// Make internet connection.
HINTERNET hInternetSession = InternetOpen(
        "Microsoft Internet Explorer",          // agent
        INTERNET_OPEN_TYPE_PRECONFIG,           // access
        NULL, NULL, 0);                         // defaults
...

// Make connection to desired page.
HINTERNET hURL = InternetOpenUrl(
        hInternetSession,                       // session handle
        szSors,                                 // URL to access
        NULL, 0, 0, 0);                         // defaults
if (hURL == 0)
    return 0;
...

// Read data into memory buffer.
DWORD dwBytesRead = 0;
BOOL bResult = InternetReadFile(
        hURL,                                   // handle to URL
        (LPSTR)cBuffer,                         // pointer to buffer
        (DWORD)MYBSIZE,                         // size of buffer
        &dwBytesRead);                          // to hold return value
...

InternetCloseHandle(hInternetSession);

我从未按你的要求下载一个字节,但我不明白为什么你不能。