ステートフルな通信が必要ですが、ブーストのエコー サーバーの例は好きではありません。私のソケットは永遠に読み取る準備ができており、新しいデータを受け取るたびに仮想メソッドを呼び出しますが、いつでもdataAvailable(string)
実行できますasync_write
。
void connected(const boost::system::error_code &ec) {
_socket.async_read_some(boost::asio::buffer(_buffer, max_length),
boost::bind(&Session::handler_read, this, boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
//boost::asio::async_read(_socket, boost::asio::buffer(_buffer, max_length),
// boost::bind(&Session::handler_read, this, boost::asio::placeholders::error,
// boost::asio::placeholders::bytes_transferred));
std::cout << ">> Session::connected()" << std::endl;
}
void handler_read(const boost::system::error_code &ec, size_t bytes_transferred) {
if(ec) {
std::cout << ec.message() << std::endl;
} else {
//std::copy(_buffer, _buffer+bytes_transferred, data.begin());
std::string data(_buffer, _buffer+bytes_transferred);
std::cout << ">> Session[ " << id() << "]" << "::handler_read(): " <<
bytes_transferred << " " << data << std::endl;
boost::asio::async_write(_socket, boost::asio::buffer(_buffer, max_length),
boost::bind(&Session::handler_write, this,
boost::asio::placeholders::error));
_socket.async_read_some(boost::asio::buffer(_buffer, max_length),
boost::bind(&Session::handler_read, this, boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
//boost::asio::async_read(_socket, boost::asio::buffer(_buffer, max_length),
// boost::bind(&Session::handler_read, this,
// boost::asio::placeholders::error,
// boost::asio::placeholders::bytes_transferred));
//call dataAvailable(_buffer);
}
}
void handler_write(const boost::system::error_code &ec) {
if(ec) {
std::cout << ec.message() << std::endl;
} else {
_socket.async_read_some(boost::asio::buffer(_buffer, max_length),
boost::bind(&Session::handler_read, this, boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
//boost::asio::async_read(_socket, boost::asio::buffer(_buffer, max_length),
// boost::bind(&Session::handler_read, this,
// boost::asio::placeholders::error,
// boost::asio::placeholders::bytes_transferred));
}
}
- この実装は大丈夫ですか?複数のスレッドが読み取りおよび書き込み操作を実行する可能性があるためです。書き込み操作では、マトリックス内のいくつかのセルが更新されます
async_read
代わりに使用すると機能しない(受信した文字列をエコーしない)理由async_read_some
- 私のリッスン サーバーでは、どこにも
listen
メソッドを呼び出していません。それでも機能します。では、なぜリッスン メソッドがあるのでしょうか。そしてそれはいつ使用されますか? - クライアントソケットがクライアント側から終了したときに通知を受け取りたいです。例 クライアントが接続を閉じました。どうすればできますか?私はカミングアウトは
End Of File
インを読むread_handler
ことですが、それが唯一の方法ですか? - 私は Session クラスを持っており、各セッションには 1 つのソケットがあります。
Session*
セッションマネージャーにコレクションを保存しています。ソケットを閉じるとdelete
、そのセッションがnullになります。の途中で発生する可能性がありvector
ます。null
では、そのセッションを安全に削除する方法は?