Всем привет!Есть система Suse Linux, программируем на с++ сокеты.(на подобие вебсервера)
Проблема заключается в том что когда у клиента отрубается интернет то соединение сервером продолжает существовать 18 минут.(много раз тестировал) Это что-то вроде какого-то таймаута.
Есть ли какие то способы уменьшить это время или вообще убрать? Ведь клиент мёртв, а сервер продолжает выполнять свою работу.Сколько литературы перерыл, не нашёл ответа..
>Всем привет!
>
>Есть система Suse Linux, программируем на с++ сокеты.(на подобие вебсервера)
>Проблема заключается в том что когда у клиента отрубается интернет то соединение
>сервером продолжает существовать 18 минут.(много раз тестировал) Это что-то вроде какого-то
>таймаута.
>Есть ли какие то способы уменьшить это время или вообще убрать? Ведь
>клиент мёртв, а сервер продолжает выполнять свою работу.
>
>Сколько литературы перерыл, не нашёл ответа..Насколько я знаю, в Apache например, сервер сам устанавливает таймаут связи клиентом, и если тот не проявляет признаков жизни через N секунд, закрывает сессию.
Там немного иначе.. до того как апаче приймет от клиента данные он ждёт (timeout) а после он ухе отправляет клиенту свою инфу и никакой таймаут там уже не нужен.. послал всю инфу и отрубил!
А мне нужно так.. инфа посылается клиенту пусть через опред. время.. и если клиент закроет браузер то посылается 0 и я могу определить это а если он отрубит инет то это определяется токо через 18мин..
Что мне портит всю картину!!
>Там немного иначе.. до того как апаче приймет от клиента данные он
>ждёт (timeout) а после он ухе отправляет клиенту свою инфу и
>никакой таймаут там уже не нужен.. послал всю инфу и отрубил!
>
>А мне нужно так.. инфа посылается клиенту пусть через опред. время.. и
>если клиент закроет браузер то посылается 0 и я могу определить
>это а если он отрубит инет то это определяется токо через
>18мин..
>Что мне портит всю картину!!man socket || man epoll.
>Там немного иначе.. до того как апаче приймет от клиента данные он
>ждёт (timeout) а после он ухе отправляет клиенту свою инфу и
>никакой таймаут там уже не нужен.. послал всю инфу и отрубил!Ваша не правда. Парсим самостоятельно доку относительно ключа KeepAlive и сопуствующих. + можно заглянуть в спеку по HTTP1.1
1. Добавить в свой протокол watchdog.
2. Выставить опции сокета SO_KEEPALIVE, TCP_KEEP* (man 7 socket tcp).
1. Демон для поддержания работоспособности системы(не понял для чего мне это?)
2. KEEP_ALIVE пробовал конечно, получается теже 18мин плюс ещё проблема.. некоторых клиентов просто отрубает..Я думал может кто знает правильное решение этой проблемы, а в доках я уже везде копался...
> 1. Демон для поддержания работоспособности системы(не понял для чего мне это?)Какой демон? Тож собака. :)
На уровне протокола определяешь сообщение, которое клиент регулярно посылает серверу, сервер ждет это сообщение и, если оно не поступает в течение определенного времени, рвет соединение.
> 2. KEEP_ALIVE пробовал конечно, получается теже 18мин плюс ещё проблема.. некоторых клиентов просто отрубает..
Так пробовал?
setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, &keep_flag, sizeof(keep_flag));
setsockopt(sock, SOL_TCP, TCP_KEEPIDLE, &keep_idle, sizeof(keep_idle));
setsockopt(sock, SOL_TCP, TCP_KEEPINTVL, &keep_intvl, sizeof(keep_intvl));
setsockopt(sock, SOL_TCP, TCP_KEEPCNT, &keep_cnt, sizeof(keep_cnt));Не забудь проверять возвращаемые значения, потому как решение непереносимое.
> Я думал может кто знает правильное решение этой проблемы, а в доках я уже везде копался...
Хотелось бы увидеть критерии правильности решения.
Правильно тебе посоветовали об отправке тестовых сообщений, но чтобы не портить протокол, используй внеполосные данные - все работает просто прекрасно.Трогать SO_KEEPALIVE имхо не поможет...
>1. Демон для поддержания работоспособности системы(не понял для чего мне это?)
>2. KEEP_ALIVE пробовал конечно, получается теже 18мин плюс ещё проблема.. некоторых клиентов
>просто отрубает..
>
>Я думал может кто знает правильное решение этой проблемы, а в доках
>я уже везде копался...
Sorry for english ;)
KEEPALIVE - yes , will help .Try also look at /proc/sys/net/ipv4 - you may find a lot of interesting things ;)
For example , tcp_keepalive_* ...
>Try also look at /proc/sys/net/ipv4 - you may find a lot of
>interesting things ;)
> For example , tcp_keepalive_* ...and tcp_retries1, tcp_retries2 ;)
have you tried to check connection timers with netstat ?
>Я думал может кто знает правильное решение этой проблемы, а в доках
>я уже везде копался...
Не знаю, как правильное - а работоющее решение - это "пинговать" удаленную сторону.
>Всем привет!
>
>Есть система Suse Linux, программируем на с++ сокеты.(на подобие вебсервера)
>Проблема заключается в том что когда у клиента отрубается интернет то соединение
>сервером продолжает существовать 18 минут.(много раз тестировал) Это что-то вроде какого-то
>таймаута.
>Есть ли какие то способы уменьшить это время или вообще убрать? Ведь
>клиент мёртв, а сервер продолжает выполнять свою работу.
>
>Сколько литературы перерыл, не нашёл ответа..man tcp
/proc/sys/net/ipv4/tcp_keepalive_time