Здравствуйте!
Пишу приложение на WSA и IOCP. Сокет связан с портом заверешния через CreateIoCompletionPort, поэтому все вызовы WSARecv/WSASend идут асинхронно, а в GetQueuedCompletionStatus() по OVERLAPPED.InternalHigh = 0 определяю, что клиент уже отвалился.
Вопрос 1: Насколько корректно определение отвалившегося клиента по OVERLAPPED.InternalHigh = 0 из GetQueuedCompletionStatus(), то есть возможна ли ситуация, когда мне придёт сообщение о нулевом приёме/отправке, а клиент всё ещё жив?
Если создать (WSACreateEvent) и привязать (WSAEventSelect) к конкретному сокету событие с FD_CLOSE, то с помощью WSAWaitForMultipleEvents() могу поймать факт отключения сокета. В
MSDN есть пример отслеживания событий для нескольких сокетов, но там для каждого создаётся своё событие. Учитывая, что ждать можно не больше 64 одновременно, то подход с индивидуальными событиями не подходит. Можно событие привязать сразу к нескольким сокетам, но WSAEnumNetworkEvents() позволяет узнать подробности о событиях лишь конкретного сокета.
Вопрос 2: Можно ли при наличии события (WSAWaitForMultipleEvents()) определить список сокетов-инициаторов без полного перебора?
или с точки зрения IOCP
Вопрос 3: Можно ли заставить IOCP сообщить о разрыве соединения в GetQueuedCompletionStatus() (или иначе) без инициации WSARecv/WSASend?
То есть вопрос в определении факта разрыва связи. Очевидно, что WSA понимает, как это сделать и успешно генерирует событие FD_CLOSE, но как-то безымянно :(
Заранее благодарен за помощь!