Что за странный способ работы с сетью (recv и WSA_IO_PENDING)?
Пишу сниффер для конкретной программы, используя LSP/SPI. Проблема в том, что это приложение очень странно работает с сетью, такого я еще не видел. Копаюсь уже несколько дней, но ничего не могу придумать.
Мой LSP/SPI провайдер обрабатывает вызовы WSPConnect, WSPSend, WSPRecv и WSPCloseSocket.
Первая странность в том, что я не вижу вызовов WSPConnect. Данные передаются, принимаются, сокеты закрываются, но нет ни одного вызова WSPConnect. Ставил отдельные хуки на connect и WSAConnect, но они ни разу не сработали.
Вторая странность в том, что WSPRecv всегда возращает ошибку WSA_IO_PENDING, но я не могу понять, как приложение в итоге считывает полученные данные. lpOverlapped указан, но hEvent нулевой. lpCompletionRoutine не передается. При этом нет ни одного вызова GetOverlappedResult, WSAGetOverlappedResult, WSPGetOverlappedResult, GetQueuedCompletionStatus и GetQueuedCompletionStatusEx. Ставил хуки - ни одного вызова (хуки рабочие на 100%). Как такое вообще может быть? Может существует еще какой-то способ узнать о завершении операции, о котором я не знаю?
Помоги, пожалуйста, разобраться как всё-таки это приложение работает с сетью. Моего опыта, к сожалению, оказалось недостаточно.
Да, Вы может "поставить сокет" на асинхронное (неблокирующее) ожидание, а затем проверять врмя от времени его статус функцией select. Ей в качестве входных параметров передаются списки сокетов, которые Вас интересуют, а она возвращает те, по которым произошли изменения.