[分享]VC++获取CS服务器及玩家比分信息[完整代码],该如何解决
[分享]VC++获取CS服务器及玩家比分信息[完整代码]
嘿嘿,之前抽空帮<欢乐英雄CS社区>的花花公子写了一个类似175PT的CS登录器!(有喜欢玩CS的朋友,可以去看看!)
在这之前也因为这个走了不少弯路,因为当初我也不知道VALVE游戏公司它有个官网专门介绍开发资料的,楞是全靠自己抓包分析这两条协议包,后面等我分析完了,结果另一个搞CS插件的朋友告诉我官方有公开的协议格式,杯催了!
反正代码不多,放出来大家参考参考!
下面是完整的VC代码 + 注释,运行效果如图所示:
主界面实际上只有三个函数,剩下的全在GlobalDefine.h/cpp里面,啥也不说了!自己看代码吧!
GlobalDefine.h
嘿嘿,之前抽空帮<欢乐英雄CS社区>的花花公子写了一个类似175PT的CS登录器!(有喜欢玩CS的朋友,可以去看看!)
在这之前也因为这个走了不少弯路,因为当初我也不知道VALVE游戏公司它有个官网专门介绍开发资料的,楞是全靠自己抓包分析这两条协议包,后面等我分析完了,结果另一个搞CS插件的朋友告诉我官方有公开的协议格式,杯催了!
反正代码不多,放出来大家参考参考!
下面是完整的VC代码 + 注释,运行效果如图所示:
主界面实际上只有三个函数,剩下的全在GlobalDefine.h/cpp里面,啥也不说了!自己看代码吧!
GlobalDefine.h
- C/C++ code
////////////////////////////////////////////////////////////////////////// // 全局公共函数与结构体定义 // // Parse两个函数请参考VALVE官方文档(部分字段暂未解析) // 参考文献: http://developer.valvesoftware.com/wiki/Server_Queries#Goldsource_servers_2 // // My blog: http://blog.****.net/wangningyu // last modify by Koma 2011-06-28 // 欢乐英雄CS社区 http://www.HappyHeros.com // // 感谢小米MM这段时间默默无闻的帮助与鼓励! #include <vector> #include <string> #include <map> #include <AFXINET.H> #include <WINSOCK2.H> #pragma comment(lib,"WS2_32.lib") #define SERVER_LIST_URL _T("http://221.235.205.105/member/serverlist.txt") #define SESSION_NAME _T("Koma and XiaoMi") #define BUF_SIZE 2048 // buffer size. #define SERVER_IP_SIZE 64 #define SERVER_NAME_SIZE 128 #define SERVER_DESCRIPT_SIZE 128 #define SERVER_DEFAULT_SIZE 24 #define USER_NAME_SIZE 64 #define USER_DEFAULT_SCORE (DWORD)0xFFFFFFFF #define USER_CONNECT_TIMELEN 20 /* Description: 服务器当前状态信息下标 Note: Last edit by Koma 2011-04-23 0:20 */ enum EnumServerHeader { ESH_TYPE = 0, // m 盗版CS均为'm' ESH_SERVER_IP = 0, // 127.0.0.1:27015 服务器IP ESH_SERVER_NAME = 1, // [欢乐英雄] 服务器名称 ESH_CURRENT_MAP = 2, // de_dust2 当前地图 ESH_GAME_DIRECTORY = 3, // cstrike 当前目录 ESH_GMAE_DESCRIPT = 4, // [QQ群] 服务器描述 ESH_USER_COUNT = 5, // 1E-1F 玩家数量30/31 ESH_BOT_COUNT = 6, // 2F BOT数量 ESH_DESICATED = 7, // 64 'l' for listen, 'd' for dedicated, 'p' for SourceTV ESH_OS = 8, // 77 主机操作系统 'l' for Linux, 'w' for Windows ESH_PASSWORD = 9, // 00 是否有密码 ESH_VAC_PROTECT = 10, // 01 是否VAC保护 }; /* Description: 服务器当前状态信息 1、服务器名称 2、当前地图 3、玩家数量 ...... (该结构体与上面EnumServerHeader相对应.) Note: Last edit by Koma 2011-05-03 */ typedef struct tagServerHeader { char m_cType; char m_szServerIP[SERVER_DEFAULT_SIZE]; char m_szServerName[SERVER_NAME_SIZE]; char m_szServerMap[SERVER_DEFAULT_SIZE]; char m_szGameDir[SERVER_DEFAULT_SIZE]; char m_szGanmeDescript[SERVER_DESCRIPT_SIZE]; char m_cSteamID; char m_cUserCurent; char m_cUserMax; char m_cBotCount; char m_cDesicated; char m_cOS; char m_cHasPassword; char m_cHasVAC; }ServerHeader; /* Description: WEB后台的服务器列表 1、服务器IP 2、服务器端口 (该结构体与上面EnumServerHeader相对应.) Note: Last edit by Koma 2011-05-03 */ typedef struct tagServerIPandPort { char m_szIP[SERVER_IP_SIZE]; int m_nPort; }ServerIPandPort; typedef std::vector<ServerIPandPort> ServerListPtr; /* Description: 服务器玩家比分 1、服务器IP 2、服务器端口 (该结构体与上面EnumServerHeader相对应.) Note: Last edit by Koma 2011-05-03 */ typedef struct tagUserInfo { char m_szUserName[USER_NAME_SIZE]; int m_nKiller; int m_nTime; }UserInfo; typedef std::vector<UserInfo> UserInfoListPtr; // 全局函数声明 BOOL GetServerHeaderInfo(char *pszIP,int nPort,ServerHeader & serInfo); BOOL GetServerListInfo(char *pszUrl,ServerListPtr *srvList); BOOL GetServerPlayerInfo(char *pszIP,int nPort,UserInfoListPtr & userInfo); void ParseUserPackets(char *pszRecv,int nLen,UserInfoListPtr & userinfo); void ParseServerPackets(char *pszRecv,int nLen,ServerHeader & servinfo); BOOL SetSocketTimeout(SOCKET &s, int nTime, BOOL bRecv); char* UTF8toMB(const char* inUtf8, char* outStr); char* ConvertIntToChar(int dwTemp); int ConvertCharToInt(char* pszBuffer); // end of file GlobalDefine.h //////////////////////////////////////////////////////////////////////////