Принуждение WSARecv к перекрытию

Я пытаюсь реализовать сервер, который использует IOCompletionPort для чтения со своих клиентов. У меня есть что-то очень похожее на этот пример< /а>.

Если я правильно понимаю, это должен быть мой дизайн:

  1. [Основная тема] Создание сокета для прослушивания, привязка и прослушивание
  2. [Основной поток] Создайте событие и прикрепите его к сигналу принятия сокета, используя WSAEventSelect.
  3. [Принять тему] Дождитесь события и примите клиента
  4. [Accept Thread] Когда клиент подключается, используйте CreateIOCompletionPort, чтобы использовать с ним очередь IOCompletion.
  5. [Accept Thread] Поток принятия вызывает первый WSARecv с параметрами перекрытия.
  6. [Рабочие потоки] Использование очереди для реализации шаблона лидер-последователь в WSARecv

После некоторого чтения WSARecv (здесь )Я обнаружил, что WSARecv может немедленно вернуться с данными, если они готовы. Это кажется немного странным, потому что это означает, что рабочий может зациклиться на WSARecv, не возвращаясь в очередь ввода-вывода, если клиент отправляет достаточно быстро - и это может привести к голоданию клиента...

В связи с этим мои вопросы:

  1. Есть ли способ «заставить» WSARecv не возвращаться немедленно? Я имею в виду, возвращать IO_PENDING в 100% случаев?
  2. Если нет - какой будет правильный дизайн, оптимизированный для масштабируемости?

Вот как я использую WSARecv:

flags = 0;
receiveResult = WSARecv(clientSocket, &(olStruct->Buffer), 1, &bytesReceived, &flags, (OVERLAPPED*)olStruct, NULL);

olStruct является расширением структуры OVERLAPPED.

РЕДАКТИРОВАТЬ: в итоге я опубликовал то, что получил от WSARecv, используя PostQueuedCompletionStatus. Хотя я хотел бы услышать и другие решения См. ответ


person Nitay    schedule 18.02.2013    source источник


Ответы (2)


Если вы связали свой дескриптор с портом завершения, WSARecv() немедленное возвращение с успехом для вас семантически эквивалентно WSARecv() возврату с ожиданием, если только у вас нет:

  • установить обход порта завершения в случае успеха, как описано в SetFileCompletionNotificationModes или
  • вы предоставляете действительный HANDLE с установленным битом, как описано в GetQueuedCompletionStatus для члена hEvent
person Sergei Vorobiev    schedule 15.03.2015

Кажется, что когда WSARecv завершается немедленно, он возвращает буфер И отправляет сообщения в очередь IOCompletionPort.

Так что текущий дизайн остается в силе.

person Nitay    schedule 18.02.2013