4

REST API を使用してファイルとして保存するために、非常に大きな文字列 (最大 16GB 相当) をクラウド サーバー (AWS に類似) に送信しようとしています。文字列を小さなチャンクでサーバーにストリーミングしたいと思います。文字列のチャンクはオンザフライで生成されます。私が知る限り、転送エンコーディングを「チャンク」に設定すると、まさにそれを行うのに役立ちます。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);

チャンク転送について私が理解していることから、各チャンクは 16 進数で表された文字列のサイズで始まり、その後に実際の文字列が続く必要があります。サイズがゼロになると、サーバーは転送が完了したことを認識します ( http://en.wikipedia.org/wiki/Chunked_transfer_encoding )。しかし、上記を実行した後にファイルの内容を見ると、「HELLOBYE」ではなく「0」しか表示されません。そのため、チャンク転送ごとにファイルを上書きするだけでなく、文字列のサイズを文字列の一部として解釈しています。

したがって、私の質問は次のようになります。

  1. チャンク転送の最初の部分を文字列のサイズとして解釈するにはどうすればよいですか?
  2. 順次チャンク転送を「連結」するにはどうすればよいですか?
4

2 に答える 2

4

これは libcurl で簡単に実行できますが、libcurl にすべてのリクエストを実行させ、送信するデータを少しずつフィードするだけにする必要があります。curlのWeb サイトにあるpost-callback.cの例は、まさにあなたが求めているものです。

重要なのは、正しいヘッダーを設定してから、読み取りコールバックを使用することです。

于 2013-03-28T09:45:10.993 に答える
0

レアリファイ。私の回答があなたの問題を解決するかどうかはわかりません。しかし、これを試して、変更後の結果を共有してください。

curl に次の構成を追加します。

curl_easy_setopt(curl, CURLOPT_HTTP_TRANSFER_DECODING, 0);

そうする理由は、libcurl がデフォルトでチャンクをデコードするからです。

あなたのネットワーク ヘッダーと、wireshark でキャプチャしたデータを投稿することで、さらにお役に立てるのではないでしょうか? そうしないと、ネットワーク プログラミングのデバッグが非常に困難になります。

一方、主な問題は libcurl にあると思います。したがって、 curl ライブラリ メールリストの下に 1 つの curl メール リストを登録して、それらの専門家にクエリをブロードキャストできるようにすることを強くお勧めします。それはあなたに多くの利益をもたらします。

于 2013-03-28T04:13:37.203 に答える