2014-01-12 2 views
1

Хотя я много читал о WSAsend (msdn), мне все еще нужны некоторые разъяснения.GQCS получает уведомление, когда WSAsend возвращает 0?

Часть моего кода:

int rc; 
    rc=WSASend(Socket,....); 

    if (rc==0) {....} 
    else if ((rc == SOCKET_ERROR) && (WSA_IO_PENDING != (err = WSAGetLastError()))) 
      { 
      printf("WSASend failed with error: %d Socket(%d) \n", err,(pTmp1->Socket)); 
      .... 
      } 

Там сказано в MSDN, что WSASend операция иногда может завершаться немедленно возвращая ноль (это не произошло во время моего тестового сервера). Так что, если это произойдет, GetQueuedCompletionStatus получит уведомление?

Заранее благодарен.

ответ

1

Если какой-либо вызов API сокета, который инициирует перекрывающуюся операцию, которая будет генерировать завершение в порт завершения ввода-вывода при завершении, возвращает 0, то генерируется и отправляется в IOCP завершение. См. this Microsoft knowledge base article. Таким образом, вам не нужна специальная обработка для случая возврата без ошибок.

Кроме ...

Если вы используете SetFileCompletionNotificationMode() установить режим FILE_SKIP_COMPLETION_PORT_ON_SUCCESS. В этом случае возвращаемое значение 0 не вызывает нормальной обработки завершения, и вам необходимо выполнить обработку завершения после успешного вызова API.

Смежные вопросы