Форум: "Прочее";
Текущий архив: 2014.12.07;
Скачать: [xml.tar.bz2];
ВнизЧто за странный способ работы с сетью (recv и WSA_IO_PENDING)? Найти похожие ветки
← →
Хинт (2014-05-06 14:57) [0]Пишу сниффер для конкретной программы, используя 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%). Как такое вообще может быть? Может существует еще какой-то способ узнать о завершении операции, о котором я не знаю?
Помоги, пожалуйста, разобраться как всё-таки это приложение работает с сетью. Моего опыта, к сожалению, оказалось недостаточно.
← →
Cobalt © (2014-05-06 18:35) [1]А название программы какое?
← →
Хинт (2014-05-06 18:40) [2]Это игра на CryEngine 3.
← →
Хинт (2014-05-06 19:39) [3]Через "Process Monitor" посмотрел стек вызовов при событии "TCP Connect": из CryNetwork.dll идёт сразу вызов MSWSock.dll.
← →
Хинт (2014-05-06 21:12) [4]Вообще лог из SPI сейчас такой (WSPRecv, WSPSend, WSPCloseSocket):
[21:03:38] Rеcv. S = 2316, Оvеrlаpped = 263FA540 (hЕvent = 0), CоmplеtiоnRоutine = 00000000. Result = WSA_IO_PENDING.
[21:03:38] Sеnd. S = 2316.
[21:03:38] Rесv. S = 2316, Оverlаpped = 263F6130 (hЕvent = 0), ComplеtiоnRоutinе = 00000000. Result = WSA_IO_PENDING.
[21:03:38] Reсv. S = 2316, Ovеrlapped = 263FA540 (hЕvent = 0), CоmpletiоnRоutinе = 00000000. Result = WSA_IO_PENDING.
[21:03:38] Sеnd. S = 2316.
[21:03:38] Rесv. S = 2316, Overlapped = 263F6130 (hEvent = 0), CоmpletiоnRoutinе = 00000000. Result = WSA_IO_PENDING.
[21:03:42] Send. S = 2316.
[21:03:42] Reсv. S = 2316, Overlapped = 263FA540 (hЕvеnt = 0), CоmpletiоnRоutinе = 00000000. Result = WSA_IO_PENDING.
[21:03:42] ClosеSocket. S = 2316.
Видно и send, и recv (всегда завершается ошибкой с WSA_IO_PENDING).
hEvent нулевой, CоmpletiоnRоutinе не установлен. Т. е. и события никто не ждет, и обратного вызова нет. Единственный вариант по логике - GetQueuedCompletionStatus(Ex), но вызова не происходит.
На всякий случай ставил хуки на ReadFile и на ReadFileEx - пусто.
← →
Rouse_ © (2014-05-06 21:15) [5]Асинхронка не только на эвентах делается, пошукай по поводу очереди сообщений
← →
Хинт (2014-05-06 21:21) [6]Что за очередь сообщений?)
← →
Inovet © (2014-05-06 21:25) [7]> [6] Хинт (06.05.14 21:21)
Это эвенты в профиль.
← →
Хинт (2014-05-06 21:47) [8]Читал сейчас про очередь сообщений, но так и не понял, как программа сможет узнать число прочитанных байт из сокета после асинхронного recv?
← →
Rouse_ © (2014-05-06 22:06) [9]Что значит как? После FD_READ recv вернет кол-во байт.
← →
Хинт (2014-05-06 22:12) [10]Так в том и дело, что recv больше не вызывается. Я выше скинул полный лог вызовов recv.
← →
Rouse_ © (2014-05-06 22:14) [11]
> Хинт (06.05.14 22:12) [10]
> Так в том и дело, что recv больше не вызывается. Я выше
> скинул полный лог вызовов recv.
По которому собственно и видно что IOCompletion не работает:[21:03:38] Rеcv. S = 2316, Оvеrlаpped = 263FA540 (hЕvent = 0), CоmplеtiоnRоutine = 00000000. Result = WSA_IO_PENDING.
А стало быть работает очередь событий.
← →
Хинт (2014-05-06 22:35) [12]> По которому собственно и видно что IOCompletion не работает
Почему не работает? Вроде бы как раз похоже на то, что работает.
Страницы: 1 вся ветка
Форум: "Прочее";
Текущий архив: 2014.12.07;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.002 c