С++ функции приема

Я подключаю несколько функций с моего сервера (С++). Я хочу подключить определенные функции, чтобы иметь возможность сбрасывать пакеты, которые некоторые клиенты отправляют (подключают/отключают пакеты). Я уже подключил функции 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);

person cpppp    schedule 16.07.2011    source источник
comment
Если это ваш сервер и ваш код, зачем вам обходные пути? Предположительно, вы можете изменить код своего сервера, чтобы регистрировать/извергать данные, которые вы получаете после возврата реального вызова API.   -  person selbie    schedule 16.07.2011
comment
Возможно, связано: stackoverflow.com/questions/4589328 /   -  person Ben Voigt    schedule 16.07.2011


Ответы (2)


Из мой ответ:

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

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

person Ben Voigt    schedule 16.07.2011

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

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

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

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

person selbie    schedule 16.07.2011
comment
Эти обратные вызовы будут вызываться только один раз каждый... функция приема должна быть вызвана снова, чтобы продолжить прием данных, даже в режиме с перекрытием. - person Ben Voigt; 16.07.2011