Принуждаване на припокриване на WSARecv

Опитвам се да внедря сървър, който използва IOCompletionPort за четене от своите клиенти. Имам нещо много подобно на този пример.

Ако разбирам правилно, това трябва да е моят дизайн:

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

След известно четене на WSARecv (Тук )Открих, че WSARecv може да се върне веднага с данните, ако данните са готови. Това изглежда доста странно, защото това означава, че работник може да се завърти на WSARecv, без да се връща към IO опашката, ако клиентът изпрати достатъчно бързо - И това може да причини глад на клиента...

Тук въпросите ми са:

  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