Мониторинг серверов Source (библиотека SSQ.dll) С++

Для тех, кто хочет сделать мир лучше.
Сообщение
Автор
Аватара пользователя
Obender
Сержант
Сержант
Сообщения: 31
Зарегистрирован: 20.12.2010
Контактная информация:

#1 Сообщение 03.05.2011, 23:21

Здравствуйте уважаемые форумчане. Мне нужна Ваша помощь в использовании библиотеки SSQ.dll (Source Server Query Library).
У меня возникают проблемы при выводе переменных max_players, num_of_bots, num_players. Вместо нужных значений выводятся крякообразы :dash: Как это можно исправить?
Вот мой исходник:

Код: Выделить всё

#include <iostream>
#include "windows.h"
#include "SSQ.h" //тут структуры и т.д.
using namespace std;



int main()
{
    //SetConsoleCP(1251);
    //SetConsoleOutputCP(1251); 
	
    char namelib[20]="SSQ.dll";
    char host[30]="78.46.73.19:27014";
    //killserver78.46.73.19:27014


    //Получаю дескриптор библиотеки
     HINSTANCE hModule=NULL;
    hModule=LoadLibraryA(namelib);
    if (hModule!=NULL)
    {
     cout<<"- Deskriptor "<<namelib<<" poluchen\n";
    }
     else
          {
               cout<<"- Deskriptor "<<namelib<<" ne poluchen\n\n";
               cin.get();
               return 0;
          }
		  
	//*****SSQ_Initialize*****
	//создаю указатель на функцию
	BOOL  (*SSQ_Initialize) (BOOL);
	//получаю адрес функции  и присваиваю его указателю
    SSQ_Initialize=(BOOL (*) (BOOL))GetProcAddress(hModule,"SSQ_Initialize");
	//вызываю функцию через ее указатель
    SSQ_Initialize(false);//
    
	//*****SSQ_SetGameServer*****
	//создаю указатель на функцию
    BOOL  (*SSQ_SetGameServer) (char*);
	//получаю адрес функции  и присваиваю его указателю
    SSQ_SetGameServer=(BOOL (*) (char*)) GetProcAddress(hModule,"SSQ_SetGameServer");
	//вызываю функцию через ее указатель
    SSQ_SetGameServer(host);
	
	//*****SSQ_GetPlayerReply*****
	//создаю обьект структуры
   SSQ_INFO_REPLY  info_reply;
   //создаю указатель на функцию
   BOOL  (*SSQ_GetInfoReply) (PSSQ_INFO_REPLY);
   //получаю адрес функции  и присваиваю его указателю
   SSQ_GetInfoReply=(BOOL (*) (PSSQ_INFO_REPLY))GetProcAddress(hModule,"SSQ_GetInfoReply");
   //вызываю функцию через ее указатель и передаю в качестве аргумента указатель на обьект структуры
   SSQ_GetInfoReply(&info_reply);
   //делаю вывод в консоль значения всех члено структуры
   cout<<"version: "<<info_reply.version<<"\n";
   cout<<"hostname: "<<info_reply.hostname<<"\n";
   cout<<"map: "<<info_reply.map<<"\n";
   cout<<"game_directory: "<<info_reply.game_directory<<"\n";
   cout<<"game_description: "<<info_reply.game_description<<"\n";
   cout<<"app_id: "<<info_reply.app_id<<"\n";
   cout<<"num_players: "<<info_reply.num_players<<"\n";
   cout<<"max_players: "<<info_reply.max_players<<"\n";
   cout<<"num_of_bots: "<<info_reply.num_of_bots<<"\n";
   cout<<"dedicated: "<<info_reply.dedicated<<"\n";
   cout<<"os: "<<info_reply.os<<"\n";
   cout<<"password: "<<info_reply.password<<"\n";
   cout<<"secure: "<<info_reply.secure<<"\n";
   cout<<"game_version: "<<info_reply.game_version<<"\n";
   
 

//выгружаю библиотеку
    FreeLibrary(hModule);
    cin.get();
    return 0;
}
Вложения
My_source_code_ssq.zip
(8.3 КБ) 92 скачивания
My_source_code_ssq.zip
(8.3 КБ) 92 скачивания
Последний раз редактировалось Obender 05.05.2011, 18:01, всего редактировалось 5 раз.

bober943
Сержант
Сержант
Сообщения: 38
Зарегистрирован: 22.10.2010

#2 Сообщение 04.05.2011, 17:42

та же самая проблема, В C++ Builder выводится два непонятных символа. Либу подключаю динамически, ибо по другому не получается, неделю бился. Теперь даже не уверен, что правильно подключил динамически....

Добавлено спустя 11 минут 58 секунд:
Obender писал(а):Здравствуйте уважаемые форумчане. Мне нужна Ваша помощь в использовании библиотеки SSQ.dll (Source Server Query Library).
У меня возникают проблемы при выводе переменных max_players, num_of_bots, num_players. Вместо нужных значений выводятся крякообразы :dash: Как это можно исправить?
Вот мой исходник:
#include <iostream>
#include "windows.h"
#include "SSQ.h" //тут описаны структуры
using namespace std;



int main()
{
char namelib[20]="SSQ.dll";
char host[30]="78.137.1.182:27017";
//killserver78.46.73.19:27014


//Получаю дескриптор библиотеки
HINSTANCE hModule=NULL;
hModule=LoadLibrary(namelib);
if (hModule!=NULL)
{
cout<<"- The descriptor of "<<namelib<<" is received\n";
}
else
{
cout<<"- The descriptor of "<<namelib<<" is not received\n";
cin.get();
return 0;
}

// Получаю адресс функции SSQ_Initialize и вызываю ее
BOOL WINAPI (*SSQ_Initialize) (BOOL ) ;

(FARPROC &)SSQ_Initialize = GetProcAddress(hModule,"SSQ_Initialize");
if (SSQ_Initialize(false))
cout<<"- Function SSQ_Initialize() has returned true\n";
else
{
cout<<"- Function SSQ_Initialize() has returned false\n";
FreeLibrary(hModule);
cin.get();
return 0;
}

// Получаю адресс функции SSQ_SetGameServer и вызываю ее
BOOL WINAPI (*SSQ_SetGameServer) (char* ) ;

(FARPROC &)SSQ_SetGameServer = GetProcAddress(hModule,"SSQ_SetGameServer");
if(SSQ_SetGameServer(host))
cout<<"= Function SSQ_SetGameServer() has returned true\n";
else
{
cout<<"- Function SSQ_SetGameServer() has returned false\n";
FreeLibrary(hModule);
cin.get();
return 0;
}



// // Получаю адресс функции SSQ_GetInfoReply и вызываю ее
PSSQ_INFO_REPLY ptr_inforeply;
BOOL WINAPI (*SSQ_GetInfoReply) (PSSQ_INFO_REPLY) ;

(FARPROC &)SSQ_GetInfoReply = GetProcAddress(hModule,"SSQ_GetInfoReply");
if (SSQ_GetInfoReply(ptr_inforeply))
{
//Вывожу значения переменных
cout<<"app_id: "<<ptr_inforeply->app_id<<"\n";
cout<<"description: "<<ptr_inforeply->game_description<<"\n";
cout<<"directory: "<<ptr_inforeply->game_directory<<"\n";
cout<<"hostname: "<<ptr_inforeply->hostname<<"\n";
cout<<"map: "<<ptr_inforeply->map<<"\n";
cout<<"max players: "<<ptr_inforeply->max_players<<"\n";//крякообраз :dash:
cout<<"num of bots: "<<ptr_inforeply->num_of_bots<<"\n";//крякообраз :dash:
cout<<"num players: "<<ptr_inforeply->num_players<<"\n";//крякообраз :dash:
cout<<"os: "<<ptr_inforeply->os<<"\n";
cout<<"password: "<<ptr_inforeply->password<<"\n";
cout<<"secure: "<<ptr_inforeply->secure<<"\n";//Wrong display
cout<<"version: "<<ptr_inforeply->game_version<<"\n";
}


FreeLibrary(hModule);
cin.get();
return 0;
}

//Obender [email protected]
Спасибо.
Спасибо тебе за твой код. Не понимал до этого как извлечь эти данные.

Аватара пользователя
Obender
Сержант
Сержант
Сообщения: 31
Зарегистрирован: 20.12.2010
Контактная информация:

#3 Сообщение 04.05.2011, 19:37

Есть подозрения что дело в типе данных. Хотя я неуверен потому как программист я без году неделя. :blush:
Если есть какие то соображения по этому пожалуйста отписывайтесь. Уж очень хочется довести дело до конца.

bober943
Сержант
Сержант
Сообщения: 38
Зарегистрирован: 22.10.2010

#4 Сообщение 04.05.2011, 23:03

Еще что-то там говорили про нулевой байт, но может это сюда не подходит.

MOZGIII
Разработчик
Разработчик
Сообщения: 910
Зарегистрирован: 09.01.2009
Откуда: Переезжаю в /dev/null
Благодарил (а): 7 раз
Поблагодарили: 65 раз
Контактная информация:

#5 Сообщение 05.05.2011, 17:17

Гляну... если, конечно, будете использовать тег

Аватара пользователя
Obender
Сержант
Сержант
Сообщения: 31
Зарегистрирован: 20.12.2010
Контактная информация:

#6 Сообщение 05.05.2011, 17:32

bober943
Я переписал код, теперь компилится нормально. Раньше компилился только в DEV C++ :blush:
Но косяки как были так и остались :dash:

Добавлено спустя 8 минут 59 секунд:
[quote="MOZGIII"]Гляну... если, конечно, будете использовать тег

Код: Выделить всё

...[/quote]
Спасибо.

bober943
Сержант
Сержант
Сообщения: 38
Зарегистрирован: 22.10.2010

#7 Сообщение 06.05.2011, 14:01

Можно код? Просто у меня все в обратную сторону.

Добавлено спустя 6 минут 4 секунды:
извиняюсь, не увидел. Так что MOZGIII, поможешь?

Аватара пользователя
Obender
Сержант
Сержант
Сообщения: 31
Зарегистрирован: 20.12.2010
Контактная информация:

#8 Сообщение 06.05.2011, 15:36

Нашел решение как исправить эти крякообразы :) . Нужно было просто привести char к int.
Теперь max_players, num_of_bots, num_players отображается корректно. Код обновил.
Но наткнулся на новую траблу. А именно хочу получить более детальную информацию о сервере (имена игроков, и т.д.). Для этого вызываю функцию SSQ_GetPlayerReply, которая возвращает FALSE вместо TRUE :dash: . Почему так происходит пока не знаю.
Очень жаль что мало желающих помочь ((
Вложения
My source code_ssq_2.zip
исправлены крякообразы
(8.36 КБ) 101 скачивание
My source code_ssq_2.zip
исправлены крякообразы
(8.36 КБ) 101 скачивание

bober943
Сержант
Сержант
Сообщения: 38
Зарегистрирован: 22.10.2010

#9 Сообщение 06.05.2011, 16:07

Не думал, что будет такое легкое решение. А насчёт Player Reply. Сейчас попробую сделать. Как сделаю отпишусь о результатах.

Аватара пользователя
Obender
Сержант
Сержант
Сообщения: 31
Зарегистрирован: 20.12.2010
Контактная информация:

#10 Сообщение 06.05.2011, 16:13

bober943 писал(а):Не думал, что будет такое легкое решение. А насчёт Player Reply. Сейчас попробую сделать. Как сделаю отпишусь о результатах.
Жду с нетерпением. :)

bober943
Сержант
Сержант
Сообщения: 38
Зарегистрирован: 22.10.2010

#11 Сообщение 06.05.2011, 16:44

хм, странно. тоже FALSE возвращает. будем копать

Аватара пользователя
Obender
Сержант
Сержант
Сообщения: 31
Зарегистрирован: 20.12.2010
Контактная информация:

#12 Сообщение 06.05.2011, 16:48

bober943 писал(а):хм, странно. тоже FALSE возвращает. будем копать
Я непонимаю в каком направлении копать. Вроде бы функция аналогичная SSQ_GetInfoReply. :Search: То есть вызываю ее также, должно работать, а не работает :dash: Хотя есть подозрение что дело во вложенной структуре. blink

bober943
Сержант
Сержант
Сообщения: 38
Зарегистрирован: 22.10.2010

#13 Сообщение 06.05.2011, 17:07

Ну незнаю что там. Я создавал обьект этой вложенной структуры - результат тот же самый

Добавлено спустя 14 минут 51 секунду:
Почитал доки по либе, нашел следующую инфу:

Remarks

SSQ_GetInfoReply does not need authentication from the game server unlike SSQ_GetPlayerReply and SSQ_GetRulesReply.
SSQ_GetInfoReply uses the server set by SSQ_SetGameServer.

Тут, как я понял, нужна аутентификация сервева, но я не понимаю что это значит

Аватара пользователя
Obender
Сержант
Сержант
Сообщения: 31
Зарегистрирован: 20.12.2010
Контактная информация:

#14 Сообщение 06.05.2011, 17:11

bober943 писал(а): SSQ_GetInfoReply does not need authentication from the game server unlike SSQ_GetPlayerReply and SSQ_GetRulesReply.
SSQ_GetInfoReply uses the server set by SSQ_SetGameServer.

Тут, как я понял, нужна аутентификация сервева, но я не понимаю что это значит
Если перевести:
SSQ_GetInfoReply не нуждается в установлении подлинности от сервера игры в отличие от SSQ_GetPlayerReply и SSQ_GetRulesReply.
Что подразумевается под установлением подлинности ? :( и как ее установить ?

bober943
Сержант
Сержант
Сообщения: 38
Зарегистрирован: 22.10.2010

#15 Сообщение 06.05.2011, 17:13

Вот я и незнаю. Надеюсь на умы здешних девелоперов. Вообще не понимаю ничего

Ответить Вложения 2