我在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(和其他几种协议)实现之间做出选择,这是不可靠的。感谢。
答案 0 :(得分:1)
如果使用GTK,您应该使用libcurl或其他HTTP客户端库(例如libsoup)。如果您需要HTTP服务器支持,可以找到它的库,例如libonion
如果您不想使用任何此类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);
我从未按你的要求下载一个字节,但我不明白为什么你不能。