Как уже говорилось в заголовке, им нужно искать способ, чтобы получить уведомление, когда клиент закрывает свою сессию ненормальным.Как уведомить анонимное завершение клиента для сервера?
Я использую ОС freeBSD. Сервер работает с потоками Xamount (в зависимости от количества CPUcore). Поэтому я не разветвляюсь, и у каждого клиента нет собственного процесса.
Именно поэтому отправка deathpackage все time_t секунд, чтобы получить SIGPIPE, не является для меня вариантом. Но мне нужно удалить левые клиенты из kqueue, потому что иначе после слишком большого количества accept() мой код, очевидно, столкнется с проблемами памяти.
Есть ли способ, я могу проверить без высокой производительности на одного клиента, они связаны или нет?
Или любое уведомление о событии, которое срабатывает, если это произойдет? Или, может быть, есть способ позволить программе отправить какой-либо сигнал на порт, даже в случае аномального завершения, до того, как процесс клиента завершится?
да, но дело в том, Kqueue имеет поведение замены выберите(), так что им не с помощью выбора в любом случае;) – dhein
нормально извините, и дайте угадаю, 'KEVENT()' не ведет например 'select()' в этом случае? –
yip, kevent() - это своего рода eventlistener, который возвращает мне список всех сокетов, которые запускают специальное событие, то есть что-то готово для записи или чтения. поэтому, если есть сокет, который закрыт клиентом, kevent() просто больше не будет передавать какие-либо события этого сокета. То почему я думаю, обработка таймера для каждого сокета была бы способом с большой свободной производительностью. (Поскольку у меня было для каждого сокета, чтобы увеличить собственное значение времени, то, что абсолютное пропустило бы поведение kqueue(), на мой взгляд) – dhein