Неудачный DisconnectEx/AcceptEx по-прежнему планирует перекрывающееся событие IOCP.

Виндовс 8, х64.

Использование перекрывающихся сокетов Windows Api с IOCP.

Заметил неожиданное поведение с сокетами: например, вызов DisconnectEx возвращает ошибку WSAENOTCONN, но позже я получаю событие в GetQueuedCompletionStatusEx именно для этого отключения (как будто оно все еще было запланировано независимо от возвращенной ошибки). То же самое происходит с AcceptEx (с другой ошибкой, например, WSAEINVAL).

Я ожидал, что событие IOCP будет запланировано только для незавершенных операций (возвращенный код ошибки WSA_IO_PENDING), но не для других ошибок.

EDIT: Мой вопрос: могут ли события IOCP планироваться системой, даже если вызовы DisconnectEx/AcceptEx возвращают ошибку (WSAGetLastError), которая не является WSA_IO_PENDING?

Спасибо!


person a_m    schedule 21.12.2012    source источник


Ответы (2)


IOCP, как правило, наводняют вас статусами в, казалось бы, странное время, в том числе после того, как вы подумали, что дескриптор закрыт... Решение, которое я использовал для этого, состояло в том, чтобы выполнить PostQueuedCompletionStatus() с настраиваемым параметром OVERLAPPED, указывающим, что "закрыто по-настоящему сейчас" после того, как я закрыл рукоять. Затем будут обрабатываться любые системные статусы в очереди, и когда я получил пользовательское OVERLAPPED, я знал, что могу освободить все свои внутренние буферы, связанные с дескриптором.

person HerrJoebob    schedule 21.12.2012
comment
Любопытная ошибка. Я с таким раньше не сталкивался. - person Cory Nelson; 22.12.2012
comment
Возможно, это было связано с моим случаем, но, как и в ОП, я использовал сокеты в этом проекте. В отсутствие фактического вопроса, на который нужно ответить, я решил поделиться. :) - person HerrJoebob; 22.12.2012
comment
IOCP обеспечивают одно завершение для каждой операции, ожидающей выполнения на сокете. Закрытие сокета не предотвращает завершение, это может привести к сбою завершения (если, например, у вас есть чтение или запись во время закрытия). Ничего странного или неожиданного в этом нет, если вы понимаете модель. - person Len Holgate; 22.12.2012
comment
К сожалению, это не отвечает на мой вопрос. - person a_m; 22.12.2012
comment
Похоже, это было... похоже, вы не поняли модель thd... :) - person Len Holgate; 03.01.2013
comment
Нет, к сожалению, не было. Вот почему я решил отредактировать свой исходный пост более конкретным вопросом. Спасибо за ответ в любом случае. - person a_m; 16.02.2013

Ответ на вышеуказанный вопрос - нет. Проблема, с которой я столкнулся, заключалась в том, что я испортил планирование нескольких событий IOCP в одной и той же перекрывающейся структуре, что привело к такому странному поведению.

person a_m    schedule 28.12.2012