У меня интересная проблема с различиями в реализациях select
и poll
в Windows / Linux.Сначала я начну с Windows, так как там все работает как положено ...
В Windows я создаю неблокирующий сокет, пытаюсь подключиться и проверить, было ли установлено соединение.вызов select
(0, nullptr, &wset, nullptr, nullptr)
, и в Windows это вернет 0, если нет соединения.Проблема решена.
Теперь в Linux это возвращает 1 и сообщает, что сокет находится в wset
, так что похоже, что я могу писать в него, но если я вызываю send
, я, очевидно, получаю SIGPIPE
.Моя следующая попытка была poll
с запросом POLLOUT
, и интересным моментом является то, что я получаю POLLHUP
и POLLOUT
.Просто POLLOUT
скажет мне, что я могу send
, но POLLHUP
будет означать, что сокет не подключен, но у меня сейчас вопрос: это надежный способ дешево проверить, если send
потерпит неудачу, или я должен просто выдать фиктивную send
размером 0, и, если она выйдет из строя, сообщить о сокете как об отказе (так как он никогда не восстановится?)