C ++ получают функции - PullRequest
       6

C ++ получают функции

0 голосов
/ 16 июля 2011

Я подключаю несколько функций с моего сервера (C ++). Я хочу подключить определенные функции, чтобы иметь возможность сбрасывать пакеты, некоторые клиенты отправляют (подключать / отключать пакеты) Я уже подключил функции recv / recvfrom и WSARecv / WSARecvFrom. Только функция WSARecvFrom вызывается (много раз), но только при запуске сервера. Какие функции мне нужно подключить для поиска пакетов подключения / отключения удаленных машин? Я заметил, что 4 функции приема никогда не вызываются во время игры на сервере! Почему?

Пример:

typedef int (WINAPI *def_recv)(SOCKET s, char* buf, int len, int flags);
def_recv Real_recv;
int WINAPI custom_recv(SOCKET s, char* buf, int len, int flags) {
    Log("recv ...");
    return Real_recv(s, buf, len, flags);
}
Real_recv = (def_recv)DetourFunction((PBYTE)(DWORD)GetProcAddress(GetModuleHandleA("ws2_32.dll"), "recv"),(PBYTE)&custom_recv);

Ответы [ 2 ]

1 голос
/ 16 июля 2011

С мой ответ :

Существует множество различных функций, используемых с сокетами.Возможно, плагин не использует функцию с именем recv.Сверху головы я могу думать о recvfrom, recvmsg, WSARecv, WSARecvFrom, WSARecvMsg, ReadFile, ReadFileEx.

Тогда плагин может бытьвыполнение запросов с перекрывающимся вводом-выводом (возможно, осложненным процедурами завершения или портами завершения), в этом случае данные сохраняются не во время, например, вызова функции ReadFile, а в более позднее время.Захватить их было бы гораздо сложнее.

1 голос
/ 16 июля 2011

Мои экстрасенсорные способности говорят мне, что ваш серверный код использует асинхронный или перекрывающийся ввод-вывод.

Те вызовы WSARecvFrom, которые вы наблюдаете при запуске, являются буферами, которые "публикуются".Когда данные действительно поступают, вызывается функция обратного вызова, указанная в качестве последнего параметра для WSARecvFrom.

То, что вы, вероятно, хотите сделать, это перехватить WSARecvFrom и заменить параметр lpCompletionRoutine своей собственной функцией обратного вызова.Он находится в вашей собственной функции обратного вызова, где вы будете регистрировать / выводить данные, которые вы пытаетесь наблюдать (затем вызывать реальную функцию обратного вызова, которую ожидает приложение).И серверный код может использовать разные функции обратного вызова для разных вызовов WSARecvFrom - поэтому действуйте осторожно.

Также вполне возможно, что серверный код не устанавливает функцию обратного вызова.Может быть, использовать IOCP или просто опрос перекрытой структуры.YMMV.

...