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 回だけ呼び出す必要があります。書き込み要求が呼び出されない限り、もう一度読み取りを行う必要があります...表示されます...まあ、少なくとも今は動作しています。