5

したがって、boost HTTP Server 3 の例に基づいて、メッセージとともに本文を送信できるように connection::handle_read を変更したいと思います。ただし、これを行う方法は私には明らかではありません。私は次のようなものを書きたい:

void connection::handle_read(const boost::system::error_code& e,
    std::size_t bytes_transferred)
{
    ...
 if (result)
    {     
      boost::asio::async_write(socket_, reply.to_buffers(),
          strand_.wrap(
            boost::bind(&connection::write_body, shared_from_this(),
              boost::asio::placeholders::error)));
    }
}

void connection::write_body(const boost::system::error_code& e)
{
    boost::asio::async_write(socket_, body_stream_,
      strand_.wrap(
      boost::bind(&connection::handle_write, shared_from_this(),
      boost::asio::placeholders::error)));
}

はどこbody_stream_ですかasio::windows::stream_handle

しかし、このアプローチは http チャンクをまったく処理しません (つまり、各チャンクの前にチャンクのサイズが送信されることを意味します)。この問題にアプローチする最善の方法は何ですか? ブースト const バッファーの要件に準拠する ifstream 用の独自のラッパーを作成する必要がありますか? または、ループ内でのasync_write複数の呼び出しの効果をシミュレートしてみてください。async_write_someソリューションの要件は、ファイル全体を常にメモリに保持することはなく、1 つまたはいくつかのチャンクのみを保持することです。

ASIO とソケットの初心者です。アドバイスをいただければ幸いです。

4

3 に答える 3

0

この例は非常に単純で、HTTP リクエストを簡単に処理する方法を示すためのものです。チャンク転送エンコーディングは、この例ではサポートされていません。あなたのためのいくつかの提案:

  • Chunked Transfer Encoding とは何かについては、RFC2616 のセクション 3.6 を参照してください。
  • 送信前に何かを行う: HTTP ヘッダーを設定して、チャンク転送エンコーディングを使用してメッセージを送信することを示します。チャンク転送エンコーディングでデータをエンコードします。

ロジックは次のようになります。

std::string http_head;
std::string http_body;

char buff[10000];
read_file_to_buff(buff);
set_http_head_values(http_head);
encode_chunk_format(buff,http_body);


boost::asio::async_write(socket_,
    boost::asio::buffer(http_head.c_str(), http_head.length()),
    boost::bind(&connection::handle_write, shared_from_this(),
    boost::asio::placeholders::error);

boost::asio::async_write(socket_,
    boost::asio::buffer(http_body.c_str(), http_body.length()),
    boost::bind(&connection::handle_write, shared_from_this(),
    boost::asio::placeholders::error);

プログラムをテストするときは、Fiddler2 を使用して http メッセージを監視できます。

于 2013-04-19T03:01:59.020 に答える