4

我正在尝试将非常大的字符串(价值高达 16GB)发送到云服务器(类似于 AWS),以便使用 REST API 作为文件存储。我想以较小的块将字符串流式传输到服务器,并且字符串块将即时生成。据我所知,将传输编码设置为“分块”将帮助我做到这一点。我已经开始使用 libcurl 库编写一个 C++ 程序来执行此操作。这是一个带有简化测试字符串的相关片段:

headers = curl_slist_append(headers, "Accept: text/plain");
headers = curl_slist_append(headers, "Content-Type: binary/octet-stream");
headers = curl_slist_append(headers, "Transfer-Encoding: chunked");

curl_easy_setopt(curl, CURLOPT_VERBOSE, true);
curl_easy_setopt(curl, CURLOPT_CUSTOMREQUEST, "PUT");
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
curl_easy_setopt(curl, CURLOPT_URL, "http://192.168.0.1:8080/namespace/test/test");

curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "5/r/nHELLO/r/n");
curl_res = curl_easy_perform(curl);

curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "3/r/nBYE/r/n");
curl_res = curl_easy_perform(curl);

curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "0/r/n");
curl_res = curl_easy_perform(curl);

根据我对分块传输的理解,每个块应该以十六进制数字表示的字符串大小开头,然后是实际字符串。当大小遇到零时,服务器知道传输已完成(http://en.wikipedia.org/wiki/Chunked_transfer_encoding)。但是,当我在执行上述操作后查看文件的内容时,我看到的只是“0”而不是“HELLOBYE”。因此,它不仅在每次块传输时覆盖文件,而且还将字符串的大小解释为字符串的一部分。

所以我的问题归结为:

  1. 如何让它将我的块传输的第一部分解释为字符串的大小?
  2. 我怎样才能让它“连接”顺序块传输?
4

2 回答 2

4

这很容易用 libcurl 完成,但你应该让 libcurl 完成整个请求,你应该只向它提供数据以一点一点地发送。curl 网站上的post-callback.c示例几乎正是您所要求的。

关键是设置正确的标头,然后使用读取回调。

于 2013-03-28T09:45:10.993 回答
0

稀薄。不知道我的回答能不能解决你的问题。但是请尝试一下并分享更改后的结果。

将以下配置添加到 curl:

curl_easy_setopt(curl, CURLOPT_HTTP_TRANSFER_DECODING, 0);

这样做的原因是 libcurl 默认会为您解码块。

也许让我为您提供更多帮助的更好方法是发布您的网络标头和由wireshark捕获的数据?否则真的很难调试网络编程。

另一方面,我认为主要问题在于 libcurl。因此,我强烈建议您在curl 库邮件列表下注册一个 curl 邮件列表,以便您可以向这些专家广播您的查询。它会让你受益匪浅。

于 2013-03-28T04:13:37.203 回答