как получить FD_CLOSE в IOCP (GetQueuedCompletionStatus)?
От: valaar  
Дата: 30.03.11 03:34
Оценка:
Здравствуйте!

Пишу приложение на 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, но как-то безымянно :(

Заранее благодарен за помощь!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.