0

私はserver3の例を次から構築しました:

http://www.boost.org/doc/libs/1_49_0/doc/html/boost_asio/examples.html

私がした唯一のことは、次のように変更しrequest_handler.cppました。

// Decode url to path.
std::string request_path;
if (!url_decode(req.uri, request_path))
{
    rep = reply::stock_reply(reply::bad_request);
    return;
}

// Request path must be absolute and not contain "..".
if (request_path.empty() || request_path[0] != '/'
  || request_path.find("..") != std::string::npos)
{
    rep = reply::stock_reply(reply::bad_request);
    return;
}

// Fill out the reply to be sent to the client.
rep.status = reply::ok;

std::string filename = "/tmp/test.mp4";
std::ifstream file (filename.c_str(), std::ios::in|std::ios::binary);

char buf[1024000]; // 1MB Buffer read
while (file.read(buf, sizeof(buf)).gcount() > 0)
       rep.content.append(buf, file.gcount());

rep.headers.resize(9);
rep.headers[0].name = "Content-Length";
rep.headers[0].value = boost::lexical_cast<std::string>(rep.content.size());
rep.headers[1].name = "Content-Type";
rep.headers[1].value = "video/mp4";

Chromeを開いてサーバーにアクセスすると、問題なくビデオを取得できます。同時に、別のタブを開いてサーバーにアクセスしても、何も起こりません。最初のタブが完了するまで待っているようです。

目標は、複数の接続を処理し、複数のファイルを送信するサーバーを持つことです..

4

1 に答える 1

0

サーバーの応答性は、次の要素に基づいています。

  • ディスク IO 呼び出しのブロックを使用しているため、データの読み取り中にスレッドがハングアップします。最大のパフォーマンスを得るには、可能な限りノンブロッキングを使用する必要があります。
  • io_service::run() を実行しているスレッドの数。

最も簡単な方法は、io_service::run() を実行するスレッドをさらに実行することです。私の推測では、最初のタブが終了するまで 2 番目のタブで応答が得られないのは、1 つのスレッドのみを実行しているためです。

より良い解決策は、ノンブロッキング ディスク io の使用も検討することです。

于 2012-05-04T23:02:57.267 に答える