Я хочу сообщение с состоянием, но не похоже на пример эхо-сервера boost. Мой сокет будет готов для чтения навсегда, и всякий раз, когда он получает новые данные, он будет вызывать виртуальный метод dataAvailable(string)
, однако он может делать async_write
в любое время.boost asio stateful socket interface
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));
}
}
- ли это реализация Хорошо? поскольку несколько потоков могут выполнять операции чтения и записи. где в операции записи Updation некоторых клеток в матрице
- Почему он не работает (не эхо это принимаемый строка), когда я использую
async_read
вместоasync_read_some
- В моем прослушивания сервера я нигде вызывающий метод
listen
, но все же его работа. Тогда почему есть метод прослушивания? и когда он используется? - Я хочу получить уведомление, когда клиентский сокет выходит со стороны клиента. например Клиент закрыл соединение. Как мне это сделать ? Я, как правило, читаю
End Of File
вread_handler
Но это единственный способ? - У меня есть класс Session, и каждый сеанс имеет один сокет. Я храню
Session*
colection в диспетчере сеансов. теперь, когда я закрываю сокет иdelete
, этот сеанс становится нулевым. и это может произойти в серединеvector
. Итак, как безопасно удалить эту сессиюnull
?
Можете ли вы отредактировать свой вопрос с помощью [автономного репродуктора] (http://sscce.org/), чтобы мы могли видеть, как он не работает? В фрагменте кода, который вы опубликовали, нет ничего очевидного. –