3

Boost ASIO ライブラリを使用して TCP クライアント プログラムを作成しています。

プロトコルは、接続時にバナー行で始まり、その後に「\r\n」が続きます。smtp のように、いつでもコマンドを送信できます。

ただし、サーバーは、要求していないときにデータを送信することもでき、「\r\n」で終了します

初期接続バナーを読み取って解析するために、このような行があります。つまり、「\r\n」が表示されたら読み取りを停止します。

boost::asio::streambuf response_;
...
boost::asio::async_read_until(socket_, response_, "\r\n",
            boost::bind(&PumpServerClient::HandleReadBanner, this,
                boost::asio::placeholders::error));

しかし、さまざまなときに質問をしたいのですが、利用可能なデータはありますか? ある場合は、「\r\n」まで読み取ります。ピーク機能が必要な気がしますが、それがどこにあるのかわかりません。

わかりました、おそらく async_read_until をもう一度呼び出すことができます。しかし、これを考えてみてください... それは決して終わりません。読み続けるデバッグが 1 回表示されます。明らかに、完了するのを永遠に待っていますが、決して完了しません。

void client::HandleReadRequest(const boost::system::error_code& err)
{
    if (!err){
        // Got some data, print it out
        std::ostringstream ss;
        ss << &response_;

        std::cout << ss.str() << std::endl;

         // Keep reading...
        boost::asio::async_read_until(socket_, response_, "\r\n",
          boost::bind(&client::HandleReadRequest, this, boost::asio::placeholders::error));

        std::cout << "keep reading" << std::endl;
    }
    else
    {
        std::cout << "Error: " << err.message() << "\n";
    }
}

わかりました、私は今それを得ると思います。私のコードを基にするのに十分な完全な例を見ていませんでした。

次のように呼び出します。

boost::asio::async_read_until(socket_, response_, "\r\n", boost::bind(&client::HandleReadRequest, this, boost::asio::placeholders::error)); \r\n が response_ バッファに現れると、関数 HandleReadRequest が呼び出されることを意味します。async_read_until を 1 回だけ呼び出す必要があります。書き込み要求が呼び出されない限り、もう一度読み取りを行う必要があります...表示されます...まあ、少なくとも今は動作しています。

4

2 に答える 2

4

ドキュメントをちらりと見てから、次のように を使用しますsocket_base::bytes_readable

boost::asio::ip::tcp::socket socket(io_service); 
...
boost::asio::socket_base::bytes_readable command(true);
socket.io_control(command);
std::size_t bytes_readable = command.get();
于 2009-12-15T22:51:29.723 に答える
2

通常、asio で非同期操作を使用する場合、「ピーク」は必要ありません。データが利用可能になると、asio は提供されたハンドラー関数を呼び出してそのことを通知します。ハンドラーが呼び出されていない場合、利用可能なデータはありません。

ソケットを「覗く」と、データが asio によって読み取られ、利用可能になるとすぐに読み取りハンドラーに渡されるため、期待どおりに機能しないと思われます。ハンドラーが呼び出されている間のわずかな間隔。async_readソケットで何も開始されていない限り、機能する可能性があります。

の場合async_read_until、読み取りハンドラーが呼び出されたときに、別の読み取り要求を投稿したいだけかもしれません。

于 2009-12-15T22:54:13.120 に答える