Согласно документации WSAPoll()
:
WSAEINVAL
Передан недопустимый параметр.Эта ошибка возвращается, если параметр fdarray
содержит указатель NULL
. Эта ошибка также возвращается, если в элементе events
любой из структур WSAPOLLFD
, указанных параметром fdarray
при запросе статуса сокета , были указаны недопустимые флаги.Эта ошибка также возвращается, если ни один из сокетов, указанных в элементе fd
любой из структур WSAPOLLFD
, на которые указывает параметр fdarray
, не был действительным.
А согласно WSAPOLLFD
документации:
events
Тип: short
Набор флагов, указывающих тип запрашиваемого статуса. Это должно быть одно или несколько из следующих значений.
POLLPRI
Данные приоритета могут считываться без блокировки.Этот флаг не поддерживается поставщиком Microsoft Winsock.
POLLRDBAND
Данные диапазона приоритета (внеполосные) можно читать без блокировки.
POLLRDNORM
Нормальные данные можно читать без блокировки.
POLLWRNORM
Нормальные данные можно записывать без блокировки.
Флаг POLLIN
определяется как комбинация POLLRDNORM
и POLLRDBAND
значения флага.Флаг POLLOUT
определяется так же, как значение флага POLLWRNORM
.
Таким образом, как вы можете видеть, POLLHUP
не задокументирован как действительный флаг для ввода до WSAPoll()
.Действительно, он не соответствует ни одному из указанных выше флагов, определенных в winsock2.h
:
/* Event flag definitions for WSAPoll(). */
#define POLLRDNORM 0x0100
#define POLLRDBAND 0x0200
#define POLLIN (POLLRDNORM | POLLRDBAND)
#define POLLPRI 0x0400
#define POLLWRNORM 0x0010
#define POLLOUT (POLLWRNORM)
#define POLLWRBAND 0x0020
#define POLLERR 0x0001
#define POLLHUP 0x0002
#define POLLNVAL 0x0004
POLLHUP
, однако, задокументирован как флаг output в элементе revents
из WSAPOLLFD
:
revents
Тип: short
Набор флагов, которые по возвращении из вызова функции WSAPoll указывают нарезультаты запроса статуса.Это может быть комбинацией следующих флагов:
...
POLLHUP
Потоковое соединение было отключено или прервано.
...
Это соответствует использованию POLLHUP
в poll()
на * платформах nix:
POLLHUP
Повесить трубку ( возвращается только в revents
; игнорируется в events
).Обратите внимание, что при чтении из канала, такого как канал или сокет потока, это событие просто указывает, что узел закрыл свой конец канала.Последующие чтения из канала вернут 0 (конец файла) только после того, как все ожидающие данные в канале были использованы.
Итак, вам не нужно (а в Windows вы не можете)явно запросите POLLHUP
, вы просто получите его бесплатно.