Поделиться через


Функция 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

См. также раздел