2017-10-27 7 views
0

私は、nghttp2とopensslを使ってAmazon AVSクラウドと通信するC言語のアプリケーションを実装しました。私は65535バイトまでの応答を得ることができます。レスポンスが65535バイトより大きい場合、アプリケーションは残りのデータを受信できず、レスポンスを受信するために永久にスタックされます。前述のように、私はHTTP/2接続にnghttp2ライブラリを使用しています。AVSからhttp2接続で65535バイト以上のデータを受信する方法はありますか?

AVSクラウドから65535バイト以上のデータサイズを取得するための設定が必要ですか? 助けてください。

+1

問題を示すサンプルコードをお知らせください。 – bta

+1

関連コードを表示してください。スタックオーバーフローはあなたからの閉鎖理由を隠すので:*デバッグのヘルプを求める質問( "なぜこのコードは機能していないの?")は、質問自体にそれを再現するのに必要な特定の問題やエラー、 。明確な問題文がない質問は、他の読者にとって有用ではありません。参照:[最小限で完全で検証可能な例の作成方法](http://stackoverflow.com/help/mcve)。* – jww

答えて

0

65535バイトしか受信できないという事実は、HTTP/2フロー制御を適切に処理していないような臭いがあります。

nghttp2ライブラリでは、フロー制御が正しく処理されるようにするために必要なことを教えてもらえませんが、nghttp2 APIを正しく使用していない(たとえば、コールバック)、または呼び出す必要のあるフロー制御を処理するAPI nghttp2を呼び出さないでください。

参照のためフロー制御in the specificationについて読むことができます。私も同じ問題に直面していた

+0

正確に。クライアントが独自のフロー制御ウィンドウを管理することも重要です。データを受け取った後は、接続時にデータを受信できることをサーバーに通知するために、ある時点でWINDOW_UPDATEフレームを送出する必要があります。そうしないと、初期ウィンドウ(デフォルトは65535バイト)が消費されます。 –

+0

nghttp2の 'nghttp2_submit_window_update'メソッドを見てください –

+0

お返事ありがとうございます。私は "nghttp2_submit_window_update"で試しましたが、まだ65535バイト以上のデータを受信できませんでした。 –

0

、およびnghttp2_option_set_no_auto_window_update(オプション、1) APIを経由して迅速な回避策として、私は無効になっnghttp2の自動ウィンドウ更新セッションを開き、

nghttp2_session_consume(セッションと呼ばれながら、stream_idの、len); nghttp2_submit_window_update(セッション、NGHTTP2_FLAG_NONE、stream_id、len); nghttp2_session_send(セッション);

データチャンクrecvコールバックデータの1つのチャンクを処理した後。私はまだ有効になっていないnghttp2の自動ウィンドウ更新機能を有効にしておくのがなぜ分かりませんか?

関連する問題