Я пытаюсь реализовать сервер, который использует IOCompletionPort для чтения со своих клиентов. У меня есть что-то очень похожее на этот пример< /а>.
Если я правильно понимаю, это должен быть мой дизайн:
- [Основная тема] Создание сокета для прослушивания, привязка и прослушивание
- [Основной поток] Создайте событие и прикрепите его к сигналу принятия сокета, используя WSAEventSelect.
- [Принять тему] Дождитесь события и примите клиента
- [Accept Thread] Когда клиент подключается, используйте CreateIOCompletionPort, чтобы использовать с ним очередь IOCompletion.
- [Accept Thread] Поток принятия вызывает первый WSARecv с параметрами перекрытия.
- [Рабочие потоки] Использование очереди для реализации шаблона лидер-последователь в WSARecv
После некоторого чтения WSARecv (здесь )Я обнаружил, что WSARecv может немедленно вернуться с данными, если они готовы. Это кажется немного странным, потому что это означает, что рабочий может зациклиться на WSARecv, не возвращаясь в очередь ввода-вывода, если клиент отправляет достаточно быстро - и это может привести к голоданию клиента...
В связи с этим мои вопросы:
- Есть ли способ «заставить» WSARecv не возвращаться немедленно? Я имею в виду, возвращать IO_PENDING в 100% случаев?
- Если нет - какой будет правильный дизайн, оптимизированный для масштабируемости?
Вот как я использую WSARecv:
flags = 0;
receiveResult = WSARecv(clientSocket, &(olStruct->Buffer), 1, &bytesReceived, &flags, (OVERLAPPED*)olStruct, NULL);
olStruct является расширением структуры OVERLAPPED.
РЕДАКТИРОВАТЬ: в итоге я опубликовал то, что получил от WSARecv, используя PostQueuedCompletionStatus. Хотя я хотел бы услышать и другие решения См. ответ