Пытаюсь вникнуть в суть 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 давал нам сигнал только тогда, когда данные были полностью отосланы\приняты? В чем прикол такой проверки\досылания данных?
Здравствуйте, Mиxa, Вы писали:
M>На практике я ни разу не видел, чтобы WSASend завершилась успешно, отослав не все данные. Даже в синтетических тестах. Но все же такой вариант теоретически возможен, увы, его надо учитывать.
Я понял.. Благодарю
Mиxa wrote:
> На практике я ни разу не видел, чтобы WSASend завершилась успешно,
> отослав не все данные. Даже в синтетических тестах. Но все же такой
> вариант теоретически возможен, увы, его надо учитывать.
Было неоднократно в кривой сети. По какой то причине приёмник не
принимал данные, и одни копились в исходящем буфере. В какой то момент
send записывал не всё, а потом и просто 0.
Posted via RSDN NNTP Server 2.1 beta