Функция ProcessSocketNotifications (winsock2.h)
Связывает набор сокетов с портом завершения и получает все уведомления, которые уже находятся в состоянии ожидания на этом порту. После связывания порт завершения получает указанные уведомления о состоянии сокета. Поддерживаются только сокеты поставщика Microsoft Winsock .
Чтобы снизить нагрузку на системные вызовы, можно зарегистрироваться для получения уведомлений и получить их в одном вызове ProcessSocketNotifications. Кроме того, их можно получить явным образом, вызвав обычные функции порта завершения ввода-вывода, такие как GetQueuedCompletionStatus. Уведомления, полученные с помощью ProcessSocketNotifications , такие же, как и с помощью GetQueuedCompletionStatusEx, которые могут включать пакеты уведомлений, отличные от изменений состояния сокета.
Флаги событий уведомления — это целочисленное значение полей dwNumberOfBytesTransferred возвращаемых структур OVERLAPPED_ENTRY . Это аналогично использованию JOBOBJECT_ASSOCIATE_COMPLETION_PORT, которая также использует поле dwNumberOfBytesTransferred для отправки целочисленных сообщений. Вызовите функцию SocketNotificationRetrieveEvents , чтобы получить их.
Дескриптор сокета можно зарегистрировать только в одной точке ввода-вывода за раз. Повторная регистрация ранее зарегистрированного дескриптора сокета перезаписывает существующую регистрацию. Перед закрытием дескриптора, используемого для регистрации, необходимо явно удалить регистрацию и дождаться уведомления SOCK_NOTIFY_EVENT_REMOVE (см . примечания в этой статье).
Дополнительные сведения и примеры кода см. в разделе Уведомления о состоянии сокета Winsock.
Синтаксис
DWORD WSAAPI ProcessSocketNotifications(
HANDLE completionPort,
UINT32 registrationCount,
SOCK_NOTIFY_REGISTRATION *registrationInfos,
UINT32 timeoutMs,
ULONG completionCount,
OVERLAPPED_ENTRY *completionPortEntries,
UINT32 *receivedEntryCount
);
Параметры
completionPort
Тип: _In_ HANDLE
Дескриптор порта завершения ввода-вывода, созданного с помощью функции CreateIoCompletionPort . Порт будет использоваться в параметре CompletionPort функции PostQueuedCompletionStatus при отправке сообщений от имени сокета.
registrationCount
Тип: _In_ UINT32
Количество регистраций, предоставляемых параметром registrationInfos.
registrationInfos
Тип: _Inout_updates_opt_(registrationCount) SOCK_NOTIFY_REGISTRATION*
Указатель на массив SOCK_NOTIFY_REGISTRATION структур, определяющих параметры регистрации уведомлений. К ним относятся интересующий сокет, интересующие события уведомлений и флаги операций. При успешном выполнении необходимо проверить элементы на наличие успешной обработки регистрации. Этот аргумент должен иметь значение NULL, если registrationCount равно 0.
timeoutMs
Тип: _In_ UINT32
Время в миллисекундах, в течение нескольких миллисекундах, когда вы хотите дождаться появления пакета завершения на порту завершения. Если пакет завершения не отображается в течение указанного времени, функция истекает и возвращает ERROR_TIMEOUT.
Если timeoutMs имеет значение INFINITE (0xFFFFFFFF), функция никогда не будет истекает. Если timeoutMs равно 0 и операция ввода-вывода для вывода из очереди не выполняется, функция немедленно истекает.
Значение timeoutMs должно быть равно 0, если completionCount равно 0.
completionCount
Тип: _In_ ULONG
Максимальное количество удаляемых структур OVERLAPPED_ENTRY . Если задано значение 0, будут обрабатываться только операции регистрации.
completionPortEntries
Тип: _Out_writes_to_opt_(completionCount, *receivedEntryCount) OVERLAPPED_ENTRY*
При входе указывает на предварительно выделенный массив OVERLAPPED_ENTRY структур. Массив не должен перекрываться с массивом registrationInfos . Значение параметра completionPortEntries должно иметь значение NULL , если completionCount равно 0.
В выходных данных получает массив OVERLAPPED_ENTRY структур, которые содержат записи. Количество элементов массива предоставляется ReceivedEntryCount. Поля dwNumberOfBytesTransferred структур являются целочисленными масками полученных событий. Поля lpOverlapped зарезервированы и не должны использоваться в качестве указателей.
receivedEntryCount
Тип: _Out_opt_ UINT32*
Указатель на переменную, получающую количество удаленных записей. Значение должно иметь значение NULL, если completionCount равно 0.
Возвращаемое значение
В случае успешного выполнения возвращает ERROR_SUCCESS. Если функция выполнена успешно и вы указали значение, отличное от 0 completionCount, но пакеты завершения не появились в течение указанного времени, возвращается WAIT_TIMEOUT. В противном случае возвращает соответствующий код ошибки WSAE* .
Если возвращается ERROR_SUCCESS или WAIT_TIMEOUT , необходимо проверить результаты регистрации отдельных регистрационных сведений. В противном случае вся операция завершится сбоем и никаких изменений не произошло.
Комментарии
Сведения о событиях, которые возможны при получении уведомления, см. в разделе SocketNotificationRetrieveEvents .
Требования
Минимальная версия клиента | Windows 10 сборки 20348 |
Минимальная версия сервера | Windows 10 сборки 20348 |
Верхняя часть | winsock2.h |
Библиотека | Ws2_32.lib |
DLL | Ws2_32.dll |