Как libevent обнаруживает, что сокет закрыт
Если я добавлю событие для определенного сокета в цикл событий, например, сокет соединения TCP. тогда может случиться так, что сокет закрыт, тогда как будет действовать libevent? это может обнаружить это?
Спасибо!
1 ответ
РЕДАКТИРОВАТЬ: Я думаю, что я сначала неправильно понял ваш вопрос.
Если вы имеете в виду, что сокет закрыт от удаленного конца
Согласно документации вы можете использовать event_new()
а также event_add()
звонки, чтобы зарегистрировать интерес в сокете. Убедитесь, что вы указали EV_READ
так как вас интересует, когда сокет закрыт.
Помните, что нет никакой разницы в готовности файлового дескриптора между данными, доступными для чтения, и закрытым сокетом. Обычно вы должны прочитать сокет, чтобы узнать, какое условие является истинным, но если вы не хотите читать сокет, вы можете найти здесь подсказку.
Если вы имеете в виду, что сокет локально закрыт (дескриптор файла был закрыт
Использование дескриптора файла после его закрытия никогда не определяется и всегда может привести к неопределенным результатам. Это не специфично для libevent. Прежде чем закрыть файловый дескриптор, вы должны убедиться, что никакой другой поток в вашей программе не использует его, и вы должны убедиться, что никакая другая часть вашей программы не будет пытаться использовать его в будущем. Это означает, что необходимо отменить регистрацию файлового дескриптора в libevent при его закрытии.