Как правильно закрыть сервер IOCP?

Я могу найти тонны статей о запуске сервера IOCP, но ни одной о его правильном завершении работы =/

Каков правильный способ выключить сервер, когда вы закончите? более конкретно, я уже использую PostQueuedCompletionStatus(), чтобы сообщить рабочим потокам о выходе, но не нужно ли мне также отменить все ожидающие операции ввода-вывода и закрыть все сокеты перед выходом?

Я нашел CancelSynchronousIo() в MSDN, и кажется, что каждый рабочий поток может вызывать эту функцию, когда он получает уведомление о завершении для выхода... это правильный способ сделать это?

спасибо за любую помощь в этом.


person CuriousGeorge    schedule 08.09.2010    source источник


Ответы (1)


Если вы пройдете по всем открытым соединениям и закроете все сокеты, то все ожидающие операции ввода-вывода завершатся сами по себе, и сервер выключится. Вы можете либо закрыть с затяжным закрытием, чтобы разрешить завершение любых ожидающих записи данных, либо вы можете отключить задержку на сокетах и ​​вызвать отбрасывание ожидающих записи данных и сброс соединений с помощью RST, а не полное завершение.

У меня есть несколько примеров серверов IOCP здесь, которые вы, возможно, уже видели, но которые показывают, как можно добиться чистого завершения работы.

person Len Holgate    schedule 08.09.2010
comment
Спасибо =) Хороший код тоже. Гораздо чище и понятнее, чем большинство проектов, которые я видел. - person CuriousGeorge; 08.09.2010
comment
Первоначальная идея заключалась в том, чтобы упростить повторное использование кода в различных проектах, которые у меня были в то время. Весь примерный код, который я видел, было очень трудно использовать повторно, и он часто включал то, что я считал «сомнительным» дизайном... Сейчас, 10 лет спустя, я все еще использую код, основанный на этом исходном коде, и все еще создаю клиентов. и серверы быстро :) Так что все получилось красиво. - person Len Holgate; 09.09.2010