我想要一個有狀態的通信,但不喜歡boost的echo服務器示例。我的套接字將準備永久閱讀,每當它接收到新數據時,它將調用虛擬方法dataAvailable(string)
但是它可以隨時做async_write
。boost asio有狀態套接字接口
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));
}
}
- 這是實現好?因爲多個線程可能會執行讀取和寫入操作。其中寫操作是在矩陣
- 爲什麼它不工作(不Echo的接收到的字符串)某些細胞的更新用,當我使用的
async_read
代替async_read_some
- 在我的聽力服務器,我無處調用
listen
方法。但仍然在工作。那麼爲什麼有一種聽法?以及何時使用? - 我想從客戶端退出客戶端套接字時收到通知。例如客戶已關閉連接。我該怎麼做 ?我的方式是讀
read_handler
但這是唯一的方法嗎? - 我有一個Session類,每個會話都有一個套接字。我在會話管理器中存儲
Session*
集合。現在當我關閉一個套接字並delete
它會話變爲空。它可能發生在vector
的中間。那麼如何安全地刪除那個會話?
你可以用[self contained reproduction](http://sscce.org/)來編輯你的問題,這樣我們就可以看到它不起作用了嗎?在你發佈的代碼片段中沒有明顯的錯誤。 –