В настоящее время я пытаюсь исправить ошибку на прокси-сервере, которую я написал в связи с вызовом socket select(). Я использую библиотеки Poco C++ (используя SocketReactor), и проблема на самом деле в коде Poco, который может быть ошибкой, но я еще не получил от них подтверждения этого.
Что происходит, так это то, что всякий раз, когда соединение внезапно прерывается, вызов сокета select() немедленно возвращается, что, как я полагаю, он и должен делать? В любом случае, он возвращает все отключенные сокеты в доступном для чтения наборе файловых дескрипторов, но проблема в том, что исключение «Сокет не подключен» возникает, когда Poco пытается запустить обработчик события onReadable, в который я бы поместил код для справиться с этим. Учитывая, что исключение перехватывается молча, а событие onReadable никогда не запускается, вызов select() продолжает немедленно возвращаться, что приводит к бесконечному циклу в SocketReactor.
Я рассматривал возможность изменения кода Poco, чтобы вместо того, чтобы автоматически перехватывать исключение, он запускал новое событие с именем onDisconnected или что-то в этом роде, чтобы можно было выполнить очистку.
Мой вопрос: есть ли какие-нибудь элегантные способы определить, закрылся ли сокет ненормально, используя вызовы select()? Я думал об использовании сообщения об исключении, чтобы определить, когда это произошло, но мне это кажется грязным.