我正在用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);
我从来没有按你的要求下载过一个字节,但我不明白为什么你不能。