Здравствуйте, Aspire, Вы писали:
A>В таком случае, обработка события на порту завершения теряет всякий смысл, поскольку, я не могу произвести никаких действий пока не придут все данные. Память не освободить, сообщение об успехе в гуи не послать и тд..
Что у тебя за надуманные проблемы? Ты же работаешь не со сферическим конем, а с конкретным, тобой определенным протоколом. В протоколе, например, первыми байтами идет размер пакета. Принимая пакет по частям ты складываешь его в буфер (если пакет большой и не пришел за один раз). Принял пакет полностью — обрабатываешь.
А>>>Может, забить на колбэк порта и стартовать обработчик по эвэнту?
Учитываем, что никому не понятно что ты _имеешь ввиду_ и пишем понятней.
A>Ну, допустим у нас есть поток, который ждет события "все данные получены/отправлены", которое я взвожу, когда WSARecv/WSASend после нуля возвратят WSA_IO_PENDING. С этим событием поток стартует и подчищает ресурсы, посылает сообщения и пр. Преимущество в том, что в этом случае, не производя никаких вычислений по кол-ву отправленных/принятых байт мы узнаем о завершении ввода всего кол-ва данных.
[утирает пот] Круто. Т.е. завершение операции ты не дожидаешься?
A>А вообще, хотелось бы линк на пример использования порта завершения при операциях чтения/записи на сокетах, чтобы понять как это было бы по правильному при большом потоке данных. Все классические примеры в гугле рассмативают IOCP в применении к accept.
Да ладно. Есть куча нормальных примеров, что здесь, что, например, на codeproject.
Советую почитать:
http://rsdn.ru/forum/message/3297736.1.aspxАвтор: Gomes
Дата: 19.02.09