0

現在、Boost ASIO を使用してクライアント サーバーの TCP/IP アプリケーションに取り組んでいます。クライアントは、次のステートメントを使用してサーバーにデータを送信します

boost::system::error_code ignored_error; 
boost::asio::write(socket, boost::asio::buffer("Hello World\0"), ignored_error);

サーバーはこのデータをそのまま読み取ります (非同期読み取りから)。

boost::asio::async_read(*sock, boost::asio::buffer(buf_server),boost::bind(&ServerRead,boost::asio::placeholders::error));

ここで読書が行われます

boost::array<char, 158> buf_server;

void ServerRead(const boost::system::error_code& error)
{
    if(!error)
    {
        std::cout << "Message: " << buf_server.data() << std::endl;
    }
    else
    {
        std::cout << "Error occurred." << error.message() << std::endl;
    }
}

ただし、「ファイルの終わり」というエラーが表示されます。だから今、私は2つの質問があります

  1. この問題を解決するにはどうすればよいですか。ここで何が間違っていますか?

  2. mybuf_serverが 158 文字ではなく 5 文字だったとします。受信者がこのバッファをデータ全体とstd::coutそれを読み取るためだけに使用するようにするにはどうすればよいでしょうか?

4

1 に答える 1

0

この動作は、アプリケーションに158バイトを読み取るように指示したが、12バイトしか送信されない場合に予想されます。これを解決するために、メッセージサイズを示す固定サイズのヘッダーを送信できます。Asioのドキュメントに含まれているチャットクライアントとサーバーの例は、これを実現する方法を示しています。クライアントの例からの抜粋です。

void handle_connect(const boost::system::error_code& error)
  {
    if (!error)
    {
      boost::asio::async_read(socket_,
          boost::asio::buffer(read_msg_.data(), chat_message::header_length),
          boost::bind(&chat_client::handle_read_header, this,
            boost::asio::placeholders::error));
    }
  }

  void handle_read_header(const boost::system::error_code& error)
  {
    if (!error && read_msg_.decode_header())
    {
      boost::asio::async_read(socket_,
          boost::asio::buffer(read_msg_.body(), read_msg_.body_length()),
          boost::bind(&chat_client::handle_read_body, this,
            boost::asio::placeholders::error));
    }
    else
    {
      do_close();
    }
  }

  void handle_read_body(const boost::system::error_code& error)
  {
    if (!error)
    {
      std::cout.write(read_msg_.body(), read_msg_.body_length());
      std::cout << "\n";
      boost::asio::async_read(socket_,
          boost::asio::buffer(read_msg_.data(), chat_message::header_length),
          boost::bind(&chat_client::handle_read_header, this,
            boost::asio::placeholders::error));
    }
    else
    {
      do_close();
    }
  }

または、区切り文字に遭遇するまで読み取るHTTPなどのよりエキゾチックなプロトコルを使用します。\r\n

于 2013-03-21T21:56:56.480 に答える