0

サーバ

Boost::Asio ベースの http WebService があります。これは、クライアント接続を非同期的に処理し、HTTP ヘッダーが前に付いた JSON コンテンツで応答します。

std::string response += "HTTP/1.0 200 OK\r\n";
response += "Content-Length: 2000\r\n";        
response += "Content-Type: application/json\r\n";
response += "Connection: close\r\n";
response += "\r\n";
response += meassageBody;

ここで、messageBody はサイズが 500 以下の JSON 構造です。

毎回-応答がクライアントに送り返された後-以下のシーケンスを呼び出して、(私が信じている)ソケットを閉じます:

m_oSocket.shutdown(boost::asio::ip::tcp::socket::shutdown_both, ec);
m_oSocket.close();

クライアント

サーバーをテストするために、サーバーにコンテンツを要求し、エラーが返されたかどうかを示す小さなクライアント アプリケーションを Qt で作成しました。

サーバーが http ヘッダーの「Content-Length」値で応答する場合:

  • (上記の例のように 2000 に) ハードコーディングされている場合、Qt クライアントはエラー コード 2 を表示します。これは、「接続が閉じられました」を表します。

  • 適切な JSON データ サイズ (通常は約 400 ~ 500) に設定すると、Qt クライアントは「不明なエラー」を表すエラー コード 0 を表示します。

質問:

  1. httpヘッダーで不適切な「Content-Length」値を送信すると、接続の終了方法にそのような影響がありますか?

  2. サーバー側でソケットを閉じると、クライアント側でも接続が閉じているように見える可能性があると思いました。両方を一度に達成する方法: 適切な「Content-Lenght」値を送信し、クライアント側で「接続を閉じました」ステータスを取得しますか?

ありがとう

4

1 に答える 1

1

Content-Length ヘッダーは、コンテンツの正確なバイト数である必要があり、それ以上でもそれ以下でもありません。そうでない場合、結果はクライアントの観点からは予測できません。

HTTP 1.0 を使用しているため、サーバーで接続を閉じるべきではありません (また、Connection: closeヘッダーも送信しないでください。クライアントは、データを読み取った後、接続を閉じます。

于 2012-07-12T04:40:30.657 に答える