我想要一个有状态的通信,但不像 boost 的 echo server 示例。我的套接字将准备好永远读取,每当它接收到新数据时,它都会调用一个虚拟方法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
方法。但它仍然有效。那么为什么会有一个listen方法呢?什么时候使用? - 我想在客户端套接字从客户端退出时收到通知。例如,客户端已关闭连接。我该怎么做 ?我出来的方式是通过阅读
End Of File
inread_handler
但这是唯一的方式吗? - 我有一个 Session 类,每个会话都有一个套接字。我将集合存储
Session*
在会话管理器中。现在,当我关闭一个套接字并且delete
该会话变为空时。它可能发生在vector
. 那么如何安全地删除该null
会话?