Порт завершения ввода / вывода, Как освободить для каждого контекста сокета и для каждого контекста ввода / вывода? - PullRequest
0 голосов
/ 24 марта 2009

Я использую IOCP на сокете UDP, и сокет UDP может быть закрыт в другом потоке. Итак, как можно безопасно освободить контекст Per Socket и Per I / O, связанный с SOCKET?

Когда я закрываю сокет, в очереди ядра все еще будет незавершенный запрос ввода-вывода.

Если я освобождаю контекст только тогда, когда сокет закрыт, GetQueueCompletionStatus может завершиться ошибкой.

Теперь мой вопрос: когда освободить контекст?

Ответы [ 4 ]

3 голосов
/ 27 ноября 2009

Я использую подсчет ссылок на все мои данные для каждого сокета и для структур ввода-вывода. Это упрощает подобные вещи, так как они удаляются, когда их ссылки уменьшаются до 0. Для некоторого примера кода, который показывает один из способов сделать это, вы можете взглянуть на мою бесплатную платформу IOCP, которую вы можете скачать с здесь .

1 голос
/ 24 марта 2009

Используйте mutex для принудительного взаимного исключения в критической секции вашего кода, которая проверит доступность сокета и откроет его при необходимости. Зафиксируйте сокет в этом потоке и отпустите его, когда закончите.

0 голосов
/ 09 октября 2011

Сначала закройте розетку. Вы получите сообщение об ошибке (я думаю, что это ERROR_OPERATION_ABORTED) из GetQueuedCompletionStatus, а затем пришло время освободить структуру. Других незавершенных запросов к этому соединению в очереди ядра к тому времени не будет, пакеты завершения сохраняются в порядке FIFO, и пакет ошибок обязательно будет последним для этого соединения.

0 голосов
/ 12 декабря 2009

Я повторно использую свои структуры для каждого сокета. После того, как я получил события завершения для всех операций чтения и записи, необходимых для этого соединения, я вызываю TransmitFile с флагами TF_DISCONNECT и TF_REUSE_SOCKET, чтобы сбросить сокет без необходимости закрывать Это. Я также сбрасываю данные для каждого соединения после прохождения события завершения для вызова TransmitFile.

...