[分享]VC++获取CS服务器及玩家比分信息[完整代码],该如何解决

[分享]VC++获取CS服务器及玩家比分信息[完整代码]
嘿嘿,之前抽空帮<欢乐英雄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
//////////////////////////////////////////////////////////////////////////