Здравствуйте, Michael Chelnokov, Вы писали:
MC>Здравствуйте, TarasCo, Вы писали:
TC>>Это понятно, но может быть какая то логическая ошибка, типа
MC>Да, там скорее всего автор запутался в последовательностях происходящих событий/вызовов. С его множеством PostQueuedCompletionStatus это неудивительно.
MC>For mLapo: Вообще-то PostQueuedCompletionStatus обычно используется в том случае, когда надо "завернуть" на IOCP нечто, изначально IOCP не поддерживающее. Например, у тебя уже есть некий черный ящик, который уведомляет о происходящем через какие-нибудь callback'и. Ты не хочешь для него плодить отдельных потоков, а хочешь чтобы уведомления от него обрабатывались в пуле потоков-обработчиков IOCP. Тогда и стОит использовать PostQueuedCompletionStatus. Частный случай такого черного ящика — команды SCM Windows-сервису.
Во-первых, спасибо вам за конструктивный диалог. C IOCP не работал раньше, может где-то и туплю.
Переписал код, сделав ненужными PostQueuedCompletionStatus.
Вначале была такая схема.
Мне нужно отправить данные:
1) В рабочем потоке создаю OverlapBuff с пометкой "IWrite".
2) В рабочем потоке вызываю PostQueuedCompletionStatus передав туда сокет, который хочет отправить и pOverlapBuff
3) В потоке IOCP отлавливаю IWrite, достаю из прараметров GetQueuedCompletionStatus сокет, после чего вызываю WSASend с необходимыми параметрами среди которых и "новый" рOverlapBuff, но уже с пометкой "IWriteComplete".
4) по получению IWriteComplete некоторым образом обновляю буфер сокета.
С получением в принципе все тоже самое, только после получения данных я снова иницирую чтение вызвав WSARead
pOverlapBuff->SetOperation(IOReadCompleted);
pOverlapBuff->SetupRead((char*)pSocket->ReadBuffer()->get_buffer() + pSocket->ReadBuffer()->get_data_size(), pSocket->ReadBuffer()->get_free_size());
uint32 dwIoSize = 0;
uint32 ulFlags = MSG_PARTIAL;
if(::WSARecv(pSocket->GetSocket(), pOverlapBuff->GetWSABuffer(), 1, &dwIoSize, &ulFlags, &pOverlapBuff->m_ol, NULL) == SOCKET_ERROR
Переписал.
Теперь при желании отправить данные, буду сразу слать и ждать нотификации об успешной отправке. С получение тоже самое. Без PostQueuedCompletionStatus. Буду тестировать.