Проблема наверн стандартная, но нормального решения её я не смог нагуглить.
Примерчик обычный... после подключения сессия начинает ждать данные сервер создаёт ещё одну и ждёт пока не придёт подключение.... запускается сессия методом start....
#include "Session.h"
int session_count = 0;
Session::Session(boost::asio::io_service &io_service): socket(io_service)
{
session_count++;
}
Session::~Session(void)
{
//socket.shutdown(boost::asio::ip::tcp::socket::shutdown_both); //не даём создавать новые асинхронные кел беки
//socket.close(); //закрываем соединение
session_count--;
}
//возрашяет сокет
boost::asio::ip::tcp::socket& Session::getSocket()
{
return socket;
}
//Запуск сессии(происходит когда клиент присоединился)
void Session::start()
{
//включаем приём сообшений от клиента
socket.async_read_some(boost::asio::buffer(recvBuffer),
boost::bind(&Session::handle_read, this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
//Пришли данные
void Session::handle_read(const boost::system::error_code& error, size_t bytes_transferred)
{
if (!error)
{
//отправка пакета обратно
socket.async_write_some(boost::asio::buffer("Hello client"),
boost::bind(&Session::handle_write, this,
boost::asio::placeholders::error));
//перезапуск
socket.async_read_some(boost::asio::buffer(recvBuffer),
boost::bind(&Session::handle_read, this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
}
else
{
delete this;
}
}
//Данные отправлены
void Session::handle_write(const boost::system::error_code& error)
{
if (!error)
{
//обработка
//.....................
}
else
{
delete this;
}
}
когда я удаляю сессию в очереди остаются асинхронные операции... которые в итоге роняют сервер...
я пробовал просто закрыть сокет... или вызывать кансел для сокета... но сервер всё равно падает.
читал под линукс всё отработает норм после вызова кансел......
как быть под виндой?