Мое приложение Linux выполняет не блокирующееся подключение TCP syscall, и затем используйте epoll_wait
обнаружить завершение трехэтапного квитирования. Иногда epoll_wait
возвраты с обоими POLLOUT
& POLLERR
события установлены для того же дескриптора сокета.
Я хотел бы понять то, что продолжается на уровне TCP. Я не могу воспроизвести его по требованию. Мое предположение то, что между двумя вызовами к epoll_wait
в моем цикле событий у нас была последовательность SYN+ACK/ACK/FIN, но снова я не могу воспроизвести его.
Это может произойти, если соединение не удалось - например, с "время ожидания соединения истекло" (для сокетов, выполняющих неблокирующее соединение, устанавливается POLLOUT
когда операция подключения завершена как для успешных, так и для неудачных результатов).
Когда POLLOUT
становится установленным для сокета, используйте getsockopt (sock, SOL_SOCKET, SO_ERROR, ...)
, чтобы проверить, было ли соединение успешным или нет ( SO_ERROR
параметр сокета в этом случае равен 0, а в противном случае указывает, почему соединение не удалось).