crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Ошибки при асинхронных опирациях asio, асинхронный сервер TCP..
Гость_Гость_Алексей_*_*
сообщение 28.12.2011, 15:21
Сообщение #1





Гости








    


Проблема наверн стандартная, но нормального решения её я не смог нагуглить.

Примерчик обычный... после подключения сессия начинает ждать данные сервер создаёт ещё одну и ждёт пока не придёт подключение.... запускается сессия методом 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;
    }
}


когда я удаляю сессию в очереди остаются асинхронные операции... которые в итоге роняют сервер...
я пробовал просто закрыть сокет... или вызывать кансел для сокета... но сервер всё равно падает.

читал под линукс всё отработает норм после вызова кансел......
как быть под виндой?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 28.12.2011, 16:42
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(Гость_Алексей_* @ 28.12.2011, 16:21) *
как быть под виндой?

И под вендой, и под linux, я бы не пользовался конструкцией:
delete this;

Если хочешь, что бы объекты Session разрушались сами используй boost::enable_shared_from_this.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_Алексей_*_*
сообщение 28.12.2011, 16:54
Сообщение #3





Гости








    


Цитата(BRE @ 28.12.2011, 16:42) *
Цитата(Гость_Алексей_* @ 28.12.2011, 16:21) *
как быть под виндой?

И под вендой, и под linux, я бы не пользовался конструкцией:
delete this;

Если хочешь, что бы объекты Session разрушались сами используй boost::enable_shared_from_this.


Ну как я понимаю через эту чтуку я буду ждать завершения всех асинхронных операций.. а потом тока вызоветься диструктор моего обьекта.
Я хочу найти способ прост обарвать цепочку событий... отменить все асинхронные операции сокета...
отправка и получение данных мне уже не нужна.. когда я добил обьект... иль я чёт непонимаю...

ну за подсказку спасибо.. я какрас копал в эту сторону.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 28.12.2011, 16:58
Сообщение #4


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(Гость_Алексей_* @ 28.12.2011, 17:54) *
Я хочу найти способ прост обарвать цепочку событий... отменить все асинхронные операции сокета...

socket::shutdown
После этого сработают все callback'и с кодом operation_aborted, при получении этого состояния просто не перезапускай новые обработчики.

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_Алексей_*_*
сообщение 28.12.2011, 17:00
Сообщение #5





Гости








    


Принципе мне неважно, откуда они будут уничтожаться... но я чёт не понимаю, что это даст.
Отловить дисконект я могу ток при записи и чтении... и удалять естественно я должен там после неких действий над объектом.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_Алексей_*_*
сообщение 28.12.2011, 17:05
Сообщение #6





Гости








    


Цитата(BRE @ 28.12.2011, 16:58) *
socket::shutdown
После этого сработают все callback'и с кодом operation_aborted, при получении этого состояния просто не перезапускай новые обработчики.


ну shutdown прост не даст запускать новые.. а те что уже были отправлены до вызова shutdown.
чё с ними.

серовно какбы ждать надо.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 28.12.2011, 17:10
Сообщение #7


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(Гость_Алексей_* @ 28.12.2011, 18:05) *
ну shutdown прост не даст запускать новые.. а те что уже были отправлены до вызова shutdown.

Про что идет речь? Что не даст запускать? :)

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_Алексей_*_*
сообщение 28.12.2011, 17:31
Сообщение #8





Гости








    


Цитата(BRE @ 28.12.2011, 17:10) *
Про что идет речь? Что не даст запускать?



http://www.boost.org/doc/libs/1_47_0/doc/h.../overload1.html
.....This function is used to disable send operations, receive operations, or both.

как я понимаю функция shutdown заставит сокет игнорить вызов асинхронных методов записи и чтения...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 28.12.2011, 18:00
Сообщение #9


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(Гость_Алексей_* @ 28.12.2011, 18:31) *
как я понимаю функция shutdown заставит сокет игнорить вызов асинхронных методов записи и чтения...

Какого поведения мы хотим от объекта Session?
Как я понял, при определенном состоянии ты хочешь прервать всю обработку и разрушить объект?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_Алексей_*_*
сообщение 28.12.2011, 20:22
Сообщение #10





Гости








    


Цитата(BRE @ 28.12.2011, 18:00) *
Какого поведения мы хотим от объекта Session?
Как я понял, при определенном состоянии ты хочешь прервать всю обработку и разрушить объект?


Ага.)))
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 22.11.2024, 0:42