📄 gobangdeal.cpp
字号:
// GobangDeal.cpp: implementation of the GobangDeal class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "GobangServer.h"
#include "GobangDeal.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
extern CShareMemory<NODE_STRUCT> *svr_recv_queue; //接收队列
extern CShareMemory<NODE_STRUCT> *svr_send_queue; //发送队列
extern CShareMemory<NODE_STRUCT> *svr_robot_queue; //机器人交互队列
char* split(char* &text,const char *seps);
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
GobangDeal::GobangDeal(CListBox *pListBox,CString configfile)
{
this->configfile = configfile;
m_pMsgList = pListBox;
ReadFromConfig();
}
GobangDeal::~GobangDeal()
{
}
void GobangDeal::SetThreadNo(int no)
{
threadno = no;
}
int GobangDeal::GetThreadNo()
{
return threadno;
}
void GobangDeal::GetDataBasepara(CString &sdatabase,CString &sdbusername,CString &sdbpassword,CString &slogdir)
{
sdatabase = this->database;
sdbpassword = this->dbpassword;
sdbusername = this->dbusername;
slogdir = this->logdir;
}
//读配置文件
void GobangDeal::ReadFromConfig()
{
char buf[1024];
threadnum = ::GetPrivateProfileInt("THREAD","gobang",10,configfile);
::GetPrivateProfileString("DB","database","",buf,sizeof(buf),configfile);
database =buf;
::GetPrivateProfileString("DB","username","",buf,sizeof(buf),configfile);
dbusername = buf;
::GetPrivateProfileString("DB","password","",buf,sizeof(buf),configfile);
dbpassword = buf;
::GetPrivateProfileString("LOG","gobanglogdir","",buf,sizeof(buf),configfile);
logdir = buf;
logfile = logdir + "gobang.txt";
}
BOOL GobangDeal::Init()
{
// DbpInit();
//实例化一个共享内存对象
svr_recv_queue = new CShareMemory<NODE_STRUCT> (GOBANG_RECV_KEY);
if(!svr_recv_queue->Init(QUEUE_LENGTH)){
AddMsg("初始化接收共享内存时产生错误!","系统错误",MB_OK|MB_ICONSTOP);
exit(-1);
}
else{
AddMsg("初始化接收共享内存时成功");
}
svr_send_queue = new CShareMemory<NODE_STRUCT> (GOBANG_SEND_KEY);
if(!svr_send_queue->Init(QUEUE_LENGTH)){
AddMsg("初始化发送共享内存时产生错误!","系统错误",MB_OK|MB_ICONSTOP);
exit(-1);
}
else{
AddMsg("初始化发送共享内存时成功");
}
svr_robot_queue = new CShareMemory<NODE_STRUCT> (GOBANG_ROBOT_KEY);
if(!svr_robot_queue->Init(QUEUE_LENGTH)){
AddMsg("初始化机器人交互共享内存时产生错误!","系统错误",MB_OK|MB_ICONSTOP);
exit(-1);
}
else{
AddMsg("初始化机器人交互共享内存时成功");
}
return true;
}
UINT GobangDeal::Run()
{
Init();
for(int i = 0; i < threadnum; i++)
{
SetThreadNo(i+1);
pRecvThread[i] = AfxBeginThread(RecvThreadFunc,this,THREAD_PRIORITY_NORMAL);
Sleep(100);
}
AddMsg("五子棋服务程序初始化完成!");
return PBL_Error_OK;
}
//功能:向监视窗口添加一条信息
//参数:csMsg是要显示的信息
void GobangDeal::AddMsg(LPCTSTR fmt , ...)
{
va_list args;
CTime ctTime = CTime::GetCurrentTime();
CString csTime = ctTime.Format("[%Y-%m-%d %H:%M:%S]");
char szBuf[1024];
va_start(args, fmt);
vsprintf(szBuf,fmt,args);
va_end(args);
csTime = csTime + " " + szBuf;
if(m_pMsgList->GetCount() > MAXSHOWLINES-1){
m_pMsgList->DeleteString(0);
}
m_pMsgList->AddString(csTime);
WriteLog(szBuf);
}
//功能:写LOG
//参数:sLogFile为Log文件名,sFileName指名哪个文件写LOG
//参数:nLine表明在第X行写LOG,fmt见printf...
BOOL GobangDeal::WriteLog(LPCTSTR fmt , ...)
{
va_list args;
FILE *fp;
time_t t;
struct tm *ptm;
time(&t);
ptm = localtime(&t);
if((fp = fopen(logfile, "a+t")) == NULL)
return FALSE;
fprintf(fp,"[%04d%02d%02d %02d:%02d:%02d] ",
ptm->tm_year + 1900,
ptm->tm_mon +1,
ptm->tm_mday,
ptm->tm_hour,
ptm->tm_min,
ptm->tm_sec);
va_start(args, fmt);
vfprintf(fp,fmt,args);
fprintf(fp,"\n");
va_end(args);
fclose(fp);
return TRUE;
}
/************************************************************************
函数功能:获取房间列表信息
************************************************************************/
void GobangDeal::GetRoomList(TDBPEx *dbp,NODE_STRUCT recvnode){
char sqlbuf[1024]={0};
char *tempstr;
char *body;
CString roomid,capacity,usernum,roominfo;
CString userid;
body = recvnode.body;
tempstr=split(body,SUBDIVISION);
userid = tempstr;
//调整五子棋用户信息表
sprintf( sqlbuf,
"select userid from gobang_userinfo where userid = '%s'",userid);
dbp->SQLExecDirect(sqlbuf,FALSE);
if(dbp->SQLFetch() == PBL_Error_OK)
{
//五子棋用户信息表更新
dbp->SQLFreeStmt();
sprintf( sqlbuf, "update gobang_userinfo set status='01',queuenum=%d,ipaddress='%s',\
connectport=%d where userid='%s'",recvnode.queuenum,recvnode.clientip,recvnode.clientport,userid);
dbp->SQLExecDirect(sqlbuf,TRUE,TRUE);
}
else
{
dbp->SQLFreeStmt();
sprintf( sqlbuf, "insert into gobang_userinfo(userid,status,queuenum,ipaddress,connectport) \
values('%s','01',%d,'%s',%d)",userid, recvnode.queuenum,recvnode.clientip,recvnode.clientport);
dbp->SQLExecDirect(sqlbuf,TRUE,TRUE);
}
//获取房间列表信息
sprintf( sqlbuf,
"select roomid,capacity,usernum from Gobang_roominfo");
dbp->SQLExecDirect(sqlbuf,FALSE);
roominfo="";
while(dbp->SQLFetch() == PBL_Error_OK)
{
dbp->SQLGetDataStr(1,roomid);
dbp->SQLGetDataStr(2,capacity);
dbp->SQLGetDataStr(3,usernum);
roominfo =roominfo+roomid+"$"+capacity+"$"+usernum+";";
}
dbp->SQLFreeStmt();
//响应信息:是否获取成功(0:成功 1:失败)
sprintf( recvnode.body, "%s;%s;", "0", roominfo );
this->WriteLog("operateid:%s,%s",recvnode.clientip,recvnode.operate_id);
this->WriteLog("body:%s",recvnode.body);
if(recvnode.queuenum < 0) { //玩家为机器人
svr_robot_queue->Insert(&recvnode);
}else{
svr_send_queue->Insert(&recvnode);
}
}
/************************************************************************
函数功能:获取用户游戏统计信息
************************************************************************/
void GobangDeal::GetCountInfo(TDBPEx *dbp,NODE_STRUCT recvnode){
char sqlbuf[1024]={0};
char *tempstr;
char *body;
CString integral,gamelevel,Allcount,wincount;
CString equalcount,failcount,countgroup="";
CString userid;
body = recvnode.body;
tempstr=split(body,SUBDIVISION);
userid = tempstr;
//更新用户的socket连接
sprintf( sqlbuf, "update gobang_userinfo set status='01',queuenum=%d,ipaddress='%s',\
connectport=%d where userid='%s'",recvnode.queuenum,recvnode.clientip,recvnode.clientport,userid);
dbp->SQLExecDirect(sqlbuf,TRUE,TRUE);
sprintf( sqlbuf,
"select a.integral,b.gamelevel,a.Allcount,a.wincount,a.equalcount,a.failcount \
from gobang_userinfo a, gobang_level b where b.integral =(select max(c.integral) \
from gobang_level c where a.integral >= c.integral) and a.userid ='%s'",userid);
dbp->SQLExecDirect(sqlbuf,FALSE);
if(dbp->SQLFetch() == PBL_Error_OK)
{
dbp->SQLGetDataStr(1,integral);
dbp->SQLGetDataStr(2,gamelevel);
dbp->SQLGetDataStr(3,Allcount);
dbp->SQLGetDataStr(4,wincount);
dbp->SQLGetDataStr(5,equalcount);
dbp->SQLGetDataStr(6,failcount);
countgroup =integral+"$"+gamelevel+"$"+Allcount+"$"+wincount+"$"+failcount+"$"+equalcount;
//响应信息:是否成功(0:成功 1:失败)
sprintf( recvnode.body, "%s;%s;", "0", countgroup);
}
else
{
//响应信息:是否成功(0:成功 1:失败)
sprintf( recvnode.body, "%s;", "1");
}
dbp->SQLFreeStmt();
this->WriteLog("operateid:%s,%s",recvnode.clientip,recvnode.operate_id);
this->WriteLog("body:%s",recvnode.body);
if(recvnode.queuenum < 0) { //玩家为机器人
svr_robot_queue->Insert(&recvnode);
}else{
svr_send_queue->Insert(&recvnode);
}
}
/************************************************************************
函数功能:获取大厅信息
************************************************************************/
void GobangDeal::GetHallInfo(TDBPEx *dbp,NODE_STRUCT recvnode){
char sqlbuf[1024]={0};
char *tempstr;
char *body;
CString tableid,tableseq,status;
CString nickname,picture,usertype;
CString otheruserid,userid,roomnum,userinfo="";
body = recvnode.body;
tempstr=split(body,SUBDIVISION);
userid = tempstr;
tempstr=split(body,SUBDIVISION);
roomnum = tempstr;
//更新用户的socket连接和用户状态
sprintf( sqlbuf, "update gobang_userinfo set status='01',queuenum=%d,ipaddress='%s',\
connectport=%d where userid='%s'",recvnode.queuenum,recvnode.clientip,\
recvnode.clientport,userid);
dbp->SQLExecDirect(sqlbuf,TRUE,TRUE);
sprintf(sqlbuf,"select userid from gobang_hallinfo where userid = '%s'",userid);
dbp->SQLExecDirect(sqlbuf,false);
if(dbp->SQLFetch()==PBL_Error_OK){
dbp->SQLFreeStmt();
sprintf(sqlbuf,"delete from gobang_hallinfo where userid = '%s'",userid);
dbp->SQLExecDirect(sqlbuf);
}
//向大厅信息表里插入用户数据
sprintf( sqlbuf, "insert into gobang_hallinfo(userid,roomid) values('%s','%s')",userid,roomnum);
dbp->SQLExecDirect(sqlbuf,TRUE,TRUE);
//获取已经坐下了的用户信息
sprintf( sqlbuf,
"select a.userid,a.tableid,a.tableseq,a.status,b.nickname,b.picture,b.usertype \
from Gobang_hallinfo a, User_info b where b.userid = a.userid and \
a.status<>'00' and a.roomid = '%s'",roomnum);
dbp->SQLExecDirect(sqlbuf,FALSE);
while(dbp->SQLFetch() == PBL_Error_OK)
{
dbp->SQLGetDataStr(1,otheruserid);
dbp->SQLGetDataStr(2,tableid);
dbp->SQLGetDataStr(3,tableseq);
dbp->SQLGetDataStr(4,status);
dbp->SQLGetDataStr(5,nickname);
dbp->SQLGetDataStr(6,picture);
dbp->SQLGetDataStr(7,usertype);
if(strcmp(otheruserid,"101")==0){
int aa=0;
}
userinfo = userinfo+otheruserid+"$"+nickname+"$"+picture+"$"+usertype+"$"+status
+"$"+tableid+"$"+tableseq+";";
}
dbp->SQLFreeStmt();
//响应信息:是否获取成功(0:成功 1:失败)
sprintf( recvnode.body, "%s;%s", "0", userinfo);
this->WriteLog("operateid:%s,%s",recvnode.clientip,recvnode.operate_id);
this->WriteLog("body:%s",recvnode.body);
if(recvnode.queuenum < 0) { //玩家为机器人
svr_robot_queue->Insert(&recvnode);
}else{
svr_send_queue->Insert(&recvnode);
}
//更新用户状态
sprintf( sqlbuf, "update gobang_userinfo set roomid='%s',tableid = 0,status='02' where userid='%s'",roomnum,userid);
dbp->SQLExecDirect(sqlbuf,TRUE,TRUE);
RadioRoomInfo(dbp,roomnum,"502");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -