Я пытаюсь реализовать сервер, который использует IOCompletionPort для чтения от своих клиентов.
У меня есть что-то очень похожее на этот пример.
Если я правильно понимаю, это должен быть мой дизайн:
После прочтения на WSARecv (Вот) Я обнаружил, что WSARecv может немедленно вернуться с данными, если они готовы. Это кажется странным, потому что это означает, что рабочий может зацикливаться на WSARecv, не возвращаясь в очередь ввода-вывода, если клиент отправляет достаточно быстро — и это может вызвать голодание клиента …
Настоящие вопросы:
Вот как я использую WSARecv:
flags = 0;
receiveResult = WSARecv(clientSocket, &(olStruct->Buffer), 1, &bytesReceived, &flags, (OVERLAPPED*)olStruct, NULL);
olStruct является расширением для структуры OVERLAPPED.
РЕДАКТИРОВАТЬ:
Я закончил репостить то, что я получил от WSARecv, используя PostQueuedCompletionStatus. Хотелось бы услышать другие решения, хотя
Смотрите ответ
Если вы связали свой дескриптор с портом завершения, WSARecv()
немедленное возвращение с успехом семантически эквивалентно для вас WSARecv()
возвращение с ожиданием, если у тебя есть:
Кажется, что, когда WSARecv завершает работу немедленно, он возвращает буфер и отправляет сообщения в очередь IOCompletionPort.
Таким образом, текущий дизайн остается в силе.