URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 4954
[ Назад ]

Исходное сообщение
"Программирование сокетов - нужен специалист"

Отправлено Dimitry , 18-Дек-05 13:12 
Всем привет!

Есть система Suse Linux, программируем на с++ сокеты.(на подобие вебсервера)
Проблема заключается в том что когда у клиента отрубается интернет то соединение сервером продолжает существовать 18 минут.(много раз тестировал) Это что-то вроде какого-то таймаута.
Есть ли какие то способы уменьшить это время или вообще убрать? Ведь клиент мёртв, а сервер продолжает выполнять свою работу.

Сколько литературы перерыл, не нашёл ответа..


Содержание

Сообщения в этом обсуждении
"Программирование сокетов - нужен специалист"
Отправлено Ghecko , 18-Дек-05 13:42 
>Всем привет!
>
>Есть система Suse Linux, программируем на с++ сокеты.(на подобие вебсервера)
>Проблема заключается в том что когда у клиента отрубается интернет то соединение
>сервером продолжает существовать 18 минут.(много раз тестировал) Это что-то вроде какого-то
>таймаута.
>Есть ли какие то способы уменьшить это время или вообще убрать? Ведь
>клиент мёртв, а сервер продолжает выполнять свою работу.
>
>Сколько литературы перерыл, не нашёл ответа..

Насколько я знаю, в Apache например, сервер сам устанавливает таймаут связи  клиентом, и если тот не проявляет признаков жизни через N секунд, закрывает сессию.



"Программирование сокетов - нужен специалист"
Отправлено Dimitry , 18-Дек-05 14:06 
Там немного иначе.. до того как апаче приймет от клиента данные он ждёт (timeout) а после он ухе отправляет клиенту свою инфу и никакой таймаут там уже не нужен.. послал всю инфу и отрубил!
А мне нужно так.. инфа посылается клиенту пусть через опред. время.. и если клиент закроет браузер то посылается 0 и я могу определить это а если он отрубит инет то это определяется токо через 18мин..
Что мне портит всю картину!!


"Программирование сокетов - нужен специалист"
Отправлено be , 19-Дек-05 09:27 
>Там немного иначе.. до того как апаче приймет от клиента данные он
>ждёт (timeout) а после он ухе отправляет клиенту свою инфу и
>никакой таймаут там уже не нужен.. послал всю инфу и отрубил!
>
>А мне нужно так.. инфа посылается клиенту пусть через опред. время.. и
>если клиент закроет браузер то посылается 0 и я могу определить
>это а если он отрубит инет то это определяется токо через
>18мин..
>Что мне портит всю картину!!

man socket || man epoll.


"Программирование сокетов - нужен специалист"
Отправлено chip , 19-Дек-05 18:23 
>Там немного иначе.. до того как апаче приймет от клиента данные он
>ждёт (timeout) а после он ухе отправляет клиенту свою инфу и
>никакой таймаут там уже не нужен.. послал всю инфу и отрубил!

Ваша не правда. Парсим самостоятельно доку относительно ключа KeepAlive и сопуствующих. + можно заглянуть в спеку по HTTP1.1


"Программирование сокетов - нужен специалист"
Отправлено Andrey , 20-Дек-05 10:52 
1. Добавить в свой протокол watchdog.
2. Выставить опции сокета SO_KEEPALIVE, TCP_KEEP* (man 7 socket tcp).



"Программирование сокетов - нужен специалист"
Отправлено Dimitry , 20-Дек-05 21:16 
1. Демон для поддержания работоспособности системы(не понял для чего мне это?)
2. KEEP_ALIVE пробовал конечно, получается теже 18мин плюс ещё проблема.. некоторых клиентов просто отрубает..

Я думал может кто знает правильное решение этой проблемы, а в доках я уже везде копался...



"Программирование сокетов - нужен специалист"
Отправлено Andrey , 21-Дек-05 07:47 
> 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));

Не забудь проверять возвращаемые значения, потому как решение непереносимое.

> Я думал может кто знает правильное решение этой проблемы, а в доках я уже везде копался...

Хотелось бы увидеть критерии правильности решения.


"Программирование сокетов - нужен специалист"
Отправлено Hordi , 21-Дек-05 19:18 
Правильно тебе посоветовали об отправке тестовых сообщений, но чтобы не портить протокол, используй внеполосные данные - все работает просто прекрасно.

Трогать SO_KEEPALIVE имхо не поможет...


"Программирование сокетов - нужен специалист"
Отправлено Alexx , 29-Дек-05 08:42 
>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_*  ...



"Программирование сокетов - нужен специалист"
Отправлено Alexx , 29-Дек-05 08:47 
>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 ?


"Программирование сокетов - нужен специалист"
Отправлено rWizard , 04-Янв-06 14:39 
>Я думал может кто знает правильное решение этой проблемы, а в доках
>я уже везде копался...
Не знаю, как правильное - а работоющее решение - это "пинговать" удаленную сторону.


"Программирование сокетов - нужен специалист"
Отправлено nonstop , 18-Июн-08 16:20 
>Всем привет!
>
>Есть система Suse Linux, программируем на с++ сокеты.(на подобие вебсервера)
>Проблема заключается в том что когда у клиента отрубается интернет то соединение
>сервером продолжает существовать 18 минут.(много раз тестировал) Это что-то вроде какого-то
>таймаута.
>Есть ли какие то способы уменьшить это время или вообще убрать? Ведь
>клиент мёртв, а сервер продолжает выполнять свою работу.
>
>Сколько литературы перерыл, не нашёл ответа..

man tcp
/proc/sys/net/ipv4/tcp_keepalive_time