Функция WSAPoll (winsock2.h)
Функция WSAPoll определяет состояние одного или нескольких сокетов.
Синтаксис
int WSAAPI WSAPoll(
[in, out] LPWSAPOLLFD fdArray,
[in] ULONG fds,
[in] INT timeout
);
Параметры
[in, out] fdArray
Массив из одной или нескольких структур POLLFD , определяющих набор сокетов, для которых запрашивается состояние. Массив должен содержать по крайней мере одну структуру с допустимым сокетом. При возврате этот параметр получает обновленные сокеты с заданным для каждого члена флагов состояния revents , которые соответствуют критериям запроса о состоянии.
[in] fds
Количество структур WSAPOLLFD в fdarray. Это не обязательно количество сокетов, для которых запрашивается состояние.
[in] timeout
Значение типа , указывающее поведение ожидания на основе следующих значений.
Значение | Значение |
---|---|
Больше нуля | Время ожидания (в миллисекундах). |
Ноль | Вернитесь немедленно. |
Меньше нуля | Подождите неограниченное время. |
Возвращаемое значение
Возвращает одно из следующих значений.
Возвращаемое значение | Описание |
---|---|
Ноль | До истечения срока действия таймера сокеты не находились в состоянии запроса. |
Больше нуля | Количество элементов в fdarray , для которых элемент revents структуры POLLFD не является нулями. |
SOCKET_ERROR | Произошла ошибка. Вызовите функцию WSAGetLastError , чтобы получить расширенный код ошибки. |
Расширенный код ошибки | Значение |
---|---|
Произошел сбой сетевой подсистемы. | |
При чтении входных параметров пользователя возникло исключение. | |
Передан недопустимый параметр. Эта ошибка возвращается, если структуры WSAPOLLFD , на которые указывает параметр fdarray при запросе состояния сокета. Эта ошибка также возвращается, если ни один из сокетов, указанных в элементе fd любой из структур WSAPOLLFD , на которые указывает параметр fdarray , не был допустимым. | |
Функции не удалось выделить достаточный объем памяти. |
Комментарии
Функция WSAPoll определена в Windows Vista и более поздних версиях.
Структуры WSAPOLLFD . Приложение устанавливает соответствующие флаги в элементе событий структуры WSAPOLLFD , чтобы указать тип состояния, запрошенного для каждого соответствующего сокета. Функция WSAPoll возвращает состояние сокета в элементе revents структуры WSAPOLLFD .
Для каждого сокета вызывающий объект может запрашивать сведения о состоянии чтения или записи. Условия ошибок всегда возвращаются, поэтому запрашивать сведения о них не нужно.
Структура WSAPOLLFD , на которую указывает параметр fdarray . Для всех сокетов, которые не соответствуют этим критериям и не имеют условия ошибки, соответствующий член revents будет иметь значение 0.
При запросе состояния для этого сокета в структуре WSAPOLLFD можно задать сочетание следующих флагов:
Flag | Описание |
---|---|
POLLPRI | Приоритетные данные можно считывать без блокировки. Этот флаг не поддерживается поставщиком Microsoft Winsock. |
POLLRDBAND | Данные по диапазону приоритета (внеполосные) могут считываться без блокировки. |
POLLRDNORM | Обычные данные могут считываться без блокировки. |
POLLWRNORM | Обычные данные могут быть записаны без блокировки. |
Флаг POLLIN определяется как сочетание значений флагов POLLRDNORM и POLLRDBAND . Флаг POLLOUT определяется как значение флага POLLWRNORM .
Структура WSAPOLLFD должна содержать только сочетание указанных выше флагов, поддерживаемых поставщиком Winsock. Все остальные значения считаются ошибками, и WSAPoll вернет SOCKET_ERROR. Последующий вызов функции WSAGetLastError извлекает расширенный код ошибки WSAEINVAL. Если флаг POLLPRI установлен в сокете для поставщика Microsoft Winsock, функция WSAPoll завершится ошибкой.
Когда структуры WSAPOLLFD , на которые указывает параметр fdarray для указания состояния сокета:
Flag | Описание |
---|---|
POLLERR | Произошла ошибка. |
POLLHUP | Потоковое подключение было либо отключено, либо прервано. |
POLLNVAL | Использовался недопустимый сокет. |
POLLPRI | Приоритетные данные можно считывать без блокировки. Этот флаг не возвращается поставщиком Microsoft Winsock. |
POLLRDBAND | Данные по диапазону приоритета (внеполосные) могут считываться без блокировки. |
POLLRDNORM | Обычные данные могут считываться без блокировки. |
POLLWRNORM | Обычные данные могут быть записаны без блокировки. |
Что касается сокетов TCP и UDP:
- Структура WSAPOLLFD как обычные данные , например POLLRDNORM.
- Структура WSAPOLLFD, последующая операция recv гарантированно завершится без блокировки.
- Структура WSAPOLLFDот POLLWRNORM.
- Структура WSAPOLLFDот POLLRDNORM. Последующий вызов для принятия гарантированно завершится без блокировки.
- Структура WSAPOLLFD от POLLRDBAND.
- Структура WSAPOLLFD, когда удаленный одноранговый узел завершает операцию отправки (получен TCP FIN). Последующий запрос функции recv вернет ноль байтов.
- Структура WSAPOLLFD, когда удаленный одноранговый узел инициирует корректное отключение.
- Структура WSAPOLLFD возвращается при внезапном отключении удаленного однорангового узла.
- Структура WSAPOLLFD при закрытии локального сокета.
Количество элементов (не сокетов) в fdarray обозначается nfds. Члены fdarray , у которых элемент fd имеет отрицательное значение, игнорируются, а их повторные события будут иметь значение POLLNVAL после возврата. Такое поведение полезно для приложения, которое поддерживает фиксированное выделение fdarray и не сжимает массив для удаления неиспользуемых записей или перераспределения памяти. Перед вызовом WSAPoll не нужно очищать повторные события для какого-либо элемента.
Аргумент времени ожидания указывает время ожидания функции перед возвратом. Положительное значение содержит количество миллисекундах, которое нужно ожидать перед возвратом. Нулевое значение приводит к немедленному возврату WSAPoll , а отрицательное значение указывает, что WSAPoll должен ждать неограниченное время.
Windows 8.1 и Windows Server 2012 R2. Эта функция поддерживается для приложений Магазина Windows в Windows 8.1, Windows Server 2012 R2 и более поздних версий.
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Windows 8.1, Windows Vista [классические приложения | Приложения UWP] |
Минимальная версия сервера | Windows Server 2008 [классические приложения | Приложения UWP] |
Целевая платформа | Windows |
Header | winsock2.h (включая Winsock2.h) |
Библиотека | Ws2_32.lib |
DLL | Ws2_32.dll |