Здравствуйте, Michael Chelnokov, Вы писали: MC>Никак. Ты заказал операцию ввода/вывода, по ее окончании тебе пришло уведомление. В уведомлении сказано, сколько байт было передано или принято. В пределах [0 ... заказанное количество].
В таком случае, обработка события на порту завершения теряет всякий смысл, поскольку, я не могу произвести никаких действий пока не придут все данные. Память не освободить, сообщение об успехе в гуи не послать и тд..
MC>Не понял проблемы.
Вытекает из предыдущей.
А>>Может, забить на колбэк порта и стартовать обработчик по эвэнту?
MC>Не знаю. Не совсем понятно, что ты понимаешь под "колбэк порта", и чем "обработчик по эвэнту" лучше него.
Ну, допустим у нас есть поток, который ждет события "все данные получены/отправлены", которое я взвожу, когда WSARecv/WSASend после нуля возвратят WSA_IO_PENDING. С этим событием поток стартует и подчищает ресурсы, посылает сообщения и пр. Преимущество в том, что в этом случае, не производя никаких вычислений по кол-ву отправленных/принятых байт мы узнаем о завершении ввода всего кол-ва данных.
А вообще, хотелось бы линк на пример использования порта завершения при операциях чтения/записи на сокетах, чтобы понять как это было бы по правильному при большом потоке данных. Все классические примеры в гугле рассмативают IOCP в применении к accept.
В принципе-то, рабочий пример я накатал, но не могу понять как обрабатывать события, если все данные не получить/отправить за один вызов.