LINUX.ORG.RU

epoll и висящие соединения


0

3

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

как это сделать красивей чем периодический перебор всего списка соединений и сравнения текущего времени и времени соединения?

сокеты не блокирующие SO_RCVTIMEO не работает

★★★★

Последнее исправление: quest (всего исправлений: 1)
Ответ на: комментарий от quest

однако вполне логично предположить число 65535 для принятых сокетов

65535 портов одного клиента с одного адреса, допустим, 127.0.0.1, один порт сервера и его адрес, дальше — _ещё_ (прямо одновременно) 65535 портов другого клиента с _другого_ адреса 127.0.0.2 — никаких конфликтов, на сервере может быть открыто намного больше сокетов (соединений) чем 65535.

quasimoto ★★★★
()
Ответ на: комментарий от quest

Зачем отдельный epoll? Есть у тебя epoll в котором твой миллион соединений, в него добавляешь дескриптор таймера и по приходу события на чтение - проверяешь соединения, по каждому соединению сбрасываешь счетчик принятых пакетов, если он 0 значит пакетов не было, закрываешь соединение. Реализация простейшая и удобная, не нужны межпоточные синхронизации и прочее. И да, пробежать фором по 1e6 интов (кол принятных пакетов) это ваще пшик, а не нагрузка.

pulo
()
Ответ на: комментарий от pulo

в него добавляешь дескриптор таймера и по приходу события на чтение - проверяешь соединения

те таймер один и приняв его пробегать по всем соединениям? это будет аналогично отдельному треду с полным перебором. я думал создать каждому сокету по таймеру и запихать таймеры в отдельный epoll чтобы не путать от кого event от сокета или от таймера

quest ★★★★
() автор топика
Ответ на: комментарий от pulo

И да, пробежать фором по 1e6 интов (кол принятных пакетов) это ваще пшик, а не нагрузка.

Отличны придумал способ прибития всех кешей CPU. Интересно, в этой теме много ещё будет бредовых идей...

mashina ★★★★★
()
Ответ на: комментарий от mashina

Диванные герои? Ваше конструктивное предложение какое? Ничего не делать - кэш не изменится, ога. Если за кэш так бороться, можно по биту на соединение ввести, мысль простая и понятная - принял пакет - бит установил, по таймеру бит сбросил.

Если там хоть сколько то сложная обработка соединений - твой кэш будет меняться только так.

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

pulo
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.