powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / http comet server на libevent, как отследить обрыв канала ?
6 сообщений из 6, страница 1 из 1
http comet server на libevent, как отследить обрыв канала ?
    #39549047
nagisa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Исходные данные
классический многопоточный http-comet-сервер на libevent
те по запросу клиента создается "подписка" на "поток" и данные отправляются клиенту

все работает отлично, но в случае обрыва связи - к примеру телефон клиента вне зоны доступа
соответственно событие закрытия (и как следствие стандартный каллбек закрытия не вызывается) соединения не формируется и идет накопление данных в памяти

вопрос - как отследить это событие ?
смотрел на total_len в структуре (struct evbuffer) но там 0 в любом случае
...
Рейтинг: 0 / 0
http comet server на libevent, как отследить обрыв канала ?
    #39549051
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гугли SO_KEEPALIVE
...
Рейтинг: 0 / 0
http comet server на libevent, как отследить обрыв канала ?
    #39549996
nagisa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
однако способ был найден и не по пути SO_KEEPALIVE

в libevent таки есть способ отследить состояние буфера !

Код: plaintext
1.
size_t  blen=evbuffer_get_length(bufferevent_get_output(req->evcon->bufev));


где
blen - размер в байтах
req - исходный запрос

для доступа к функциям надо подключить
Код: plaintext
1.
#include <http-internal.h>



соответственно в таймере-обработчике перед отправкой нового пакета данных
надо просто проверить пуст ли буфер
...
Рейтинг: 0 / 0
http comet server на libevent, как отследить обрыв канала ?
    #39550484
dbpatch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nagisaнадо просто проверить пуст ли буфер
вообще-то нет.

у тебя клиент - мобильный телефон, он 100% сидит за каким-нибудь NAT, который соорудил ОПСОС.

опсосу не выгодно держать у себя 100500 померших потоков, потому он наверняка просто молча дропает коннекшины в NAT таблице, не всегда уведомляя стороны об этом, что или на клиенте вешает сокет в ожидание, или на сервере, или вообще на обеих концах. а может и не дропает, или вообще ведет себя как ему захочется - там ведь все заточено под нормальный HTTP трафик,
а не под long пулинг

потому единственный способ обеспечить нормальную жизнь приложению - это выставлять keepalive, причем на обеих сторонах.

иначе сервер у тебя может и что-то там себе соптимизирует, а вот клиент будет ждать свой запрос часами
...
Рейтинг: 0 / 0
http comet server на libevent, как отследить обрыв канала ?
    #39550658
nagisa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dbpatch,
все верно и это уже учтено, был единственный вопрос по буферу на сервере, который теперь тоже закрыт
...
Рейтинг: 0 / 0
http comet server на libevent, как отследить обрыв канала ?
    #39551763
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
nagisa,
кроме кипалива могут помочь ещё ping-запросы реализованные на уровне протокола приложения.
и соответственно если пинг вовремя не пришел, разрыв соединения.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / http comet server на libevent, как отследить обрыв канала ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]