C / c++ -如何一个字节一个字节地从网上下载(像文件流一样)



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

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(和其他几个协议)实现之间做出选择,这是不可靠的。谢谢。

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

你也可以考虑POCO或Qt5框架,它们都有HTTP的东西。

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

您可以尝试实现HTTP的子集,其中可能在某些情况下工作,但您很容易发现HTTP服务器或客户端需要更多的HTTP, ....而且你的实现会比现有的HTTP库更加脆弱和漏洞百出…

刚刚注意到您不需要外部库的编辑需求。下面是我用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);

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

最新更新