Пытаюсь вникнуть в суть IOCP. Прочитал несколько основных статей в MSDN по этому поводу.
Сейчас пытаюсь написать простенький iocp-сервер на основе этой статьи —
http://www.codeproject.com/Articles/13382/A-simple-application-using-I-O-Completion-Ports-an.
Там ниже есть код WorkerThread.
Не совсем понятна работа функций WSASend\WSARecv в этом контексте.
Там есть такой момент:
case OP_READ:
pClientContext->IncrSentBytes(dwBytesTransfered);
//Write operation was finished, see if all the data was sent.
//Else post another write.
if(pClientContext->GetSentBytes() < pClientContext->GetTotalBytes())
{
pClientContext->SetOpCode(OP_READ);
...
//Overlapped send
nBytesSent = WSASend(pClientContext->GetSocket(), p_wbuf, 1, &dwBytes, dwFlags, p_ol, NULL);
Т.е. по идее этот кейс подразумевает что мы сейчас должны читать, но по проверке я так понимаю не все данные были отосланы, и мы отсылаем оставшуюся часть буфера?
А есть вариант что бы GetQueuedCompletionStatus давал нам сигнал только тогда, когда данные были полностью отосланы\приняты? В чем прикол такой проверки\досылания данных?