Как настроить сокеты беркли на разрыв соединения через определенное время?
Знаю что применять нужно setsockopt но по входным параметрам не уверен что верно. Например если у клиента выключилось электричество то с проблемой своевременного закрытия на стороне сервера поможет setsockopt(socket,SOL_SOCKET,SO_KEEPALIVE,&len,sizeof(int));. А как быть если соединение не разрывалось а просто нужно через определенный интервал времени после открытия-закрыть соединение? В sysctl поставил параметр net.ipv4.tcp_fin_timeout=60 но что то сокеты не закрываются через 60 сек! вот и показалось что нужно использовать setsockopt, но вот с какими параметрами? Подскажите пожалуйста!
Данил Тунев , ты сокет на каком протоколе поднимешь?
На UDP никаких таймаутов от природы не существует.
На TCP от природы явления присутствует прогрессивная задержка повтора отсылки, в среднем по больнице всех операционок время обрыва связи теплится между 5-ю минутами и заполнением буфера отсылки. В общем смысле и на TCP тоже понять что тот хвост отрубили не получится.
Держи документ на SO_KEEPALIVE, это точно не то, что тебе пригодится.
Кажеться что можно, это же linux! Конечно писать исходники вещь довольно таки интересная но загромождать проект доп. конструкциями, и потреблением дополнительной памяти не хочеться, если есть возможность на уровне ядра решать вопрос, а ведь я не многого прошу!)
Данил Тунев, причем тут загромождение памяти? В любой функции ожидания событий от сокета (select/poll/epoll/etc) изначально есть таймаут, приложение всегда обрабатываете таймаут как событие. Поэтому в любом приложении есть таймауты на соединение. Если у вас плохо написаное серверное приложение и в нем таких таймаутов нет или нет возможности ими управлять - ставьте перед ним нормально написаный обратный прокси, в котором такие таймауты есть.
Владимир Дубровин, Мне казалось что время ожидания функции событий это не много не одно и то же что время установленное в системе как "время жизни" соединений на сокете. То есть если у epoll_wait(); последний параметр -1, то это как то связано с "временем жизни"? Другое дело если функция вернет событие означающее закрытие сокета, но то происходит только когда на другом конце провода его закрывают! В случае res2001, понятно что под "логикой приложения" он имел в виду, приложение а не ядро операционной системы и api, следовательно выделение дополнительной памяти! для массива временных меток если соединение на сокете не одно! как вариант. Нет?
Если у epoll_wait последний параметр -1, то это значит, что кто-то изо всех сил хотел выстрелить себе в ногу, т.е. это и есть случай плохо написанного приложения, при котором перед ним лучше поставить обратный прокси (nginx например).
Конец вашего вопроса не понял, соединенный (connected) сокет всегда соответствует одному соединению. В TCP всем принятым соединениям соответствует соединенный сокет, собственно это и есть соединение. Или вы имеете ввиду сокет epoll'а? Для epoll_wait обычно устанавливается таймаут соответствующий мимнимальному из таймаутов соединений.