📄 server.cpp
字号:
char szSend[20];
memset(szSend,0,20);
strcpy(szSend,"UP ERR");
send(sock->socket,szSend,sizeof(szSend),0);
}
delete[] sock->data;
}
void doGetNPCInfo(CXMLEngine& xmleng,vector<SocketInfo>&vecSockInfo,int idx)
{
SocketInfo* sock=&vecSockInfo[idx];
npc npcdata;
memset(&npcdata,0,sizeof(npcdata));
if(xmleng.FillWithNPCInfo(sock->data,npcdata))
{
send(sock->socket,(char*)&npcdata,sizeof(npcdata),0);
}
delete[] sock->data;
}
void doCheckNPC(CXMLEngine& xmleng,vector<SocketInfo>&vecSockInfo,int idx)
{
SocketInfo* sock=&vecSockInfo[idx];
if(xmleng.CheckNPC(sock->data))
{
bool hasnpc=true;
send(sock->socket,(char*)&hasnpc,sizeof(hasnpc),0);
}
else
{
bool hasnpc=false;
send(sock->socket,(char*)&hasnpc,sizeof(hasnpc),0);
}
delete[] sock->data;
}
//服务器端暂存信息函数
//消息大小:512bytes
//消息格式: | 信息头 |消息内容|
//消息头格式: | [none]/[接受玩家用户名]|发话玩家昵称 |
//
void doSaveMessage(vector<SocketInfo>&vecSockInfo,int idx)
{
SocketInfo* sock=&vecSockInfo[idx];
GameMessage* pGM=(GameMessage*)sock->data;
g_vecMessageList.push_back(*pGM);
}
//获取信息函数
void doGetMessage(vector<SocketInfo>&vecSockInfo,int idx)
{
int messNum=0;
SocketInfo* sock=&vecSockInfo[idx];
for(UINT i=0;i<g_vecMessageList.size();i++)
{
if(strcmp(g_vecMessageList[i].recver,sock->username)==0)
messNum++;
}
send(sock->socket,(char*)&messNum,sizeof(messNum),0);
while(messNum)
{
for(UINT i=0;i<g_vecMessageList.size();i++)
{
if(strcmp(g_vecMessageList[i].recver,sock->username)==0)
{
send(sock->socket,g_vecMessageList[i].message,sizeof(g_vecMessageList[i].message),0);
EraseByIndex(g_vecMessageList,i);
messNum--;
break;
}
}
}
}
//获取相关资源信息
void doGetObjectInfo(CXMLEngine& xmleng,vector<SocketInfo>&vecSockInfo,int idx)
{
SocketInfo* sockinfo=&vecSockInfo[idx];
Myobject mobj;
memset(&mobj,0,sizeof(Myobject));
/*char oname[20];
memset(oname,0,sizeof(oname));
strcpy(oname,sockinfo->data);*/
xmleng.FillWithObjectData(sockinfo->data,mobj);
/*int datasize=sizeof(mobj);
send(sockinfo->socket,(char *)&datasize,sizeof(int),0);*/
send(sockinfo->socket,(char *)&mobj,sizeof(mobj),0);
delete[] sockinfo->data;
}
//获取玩家在线列表
void doGetOnLineList(vector<SocketInfo>&vecSockInfo,int idx)
{
SocketInfo* sock=&vecSockInfo[idx];
int olnum=0;
olnum=(int)vecOnLineRoles.size();
//发送在线玩家个数
send(sock->socket,(char*)&olnum,sizeof(olnum),0);
if(olnum>0)
{
for(vector<OnLineList>::iterator iter=vecOnLineRoles.begin();iter!=vecOnLineRoles.end();iter++)
{
OnLineList tempOLR;
memset(&tempOLR,0,sizeof(tempOLR));
strcpy(tempOLR.uName,iter->uName);
strcpy(tempOLR.nName,iter->nName);
tempOLR.pos[0]=iter->pos[0];
tempOLR.pos[1]=iter->pos[1];
send(sock->socket,(char*)&tempOLR,sizeof(tempOLR),0);
}
}
}
//获取角色信息 次函数仅仅在第一次登陆游戏调用,由于本函数极其笨重,效率太低。
void doGetRoleInfo(_ConnectionPtr conn,vector<SocketInfo>&vecSockInfo,int idx,char * uName)
{
_RecordsetPtr recptr;
SocketInfo* sock=&vecSockInfo[idx];
char tName[20];
memset(tName,0,20);
strcpy(tName,uName);
char dbcomstr[256];
sprintf(dbcomstr,"select * from role where username='%s'",tName);
_variant_t counts;
recptr=conn->Execute(dbcomstr,&counts,adCmdText);
if(!recptr->adoEOF)
{
recptr->MoveFirst();
}
else
{
char szSend[20];
memset(szSend,0,20);
strcpy(szSend,"GETRI ERR");
send(sock->socket,szSend,(int)strlen(szSend),0);
return;
}
_variant_t var;
char* temp;
OnLineList m_ol;
memset(&m_ol,0,sizeof(m_ol));
player tplayer;
memset(&tplayer,0,sizeof(tplayer));
var=recptr->GetCollect("nickname");
temp=_com_util::ConvertBSTRToString((_bstr_t)var);
strcpy(m_ol.nName,temp);
strcpy(tplayer.nickName,temp);
var=recptr->GetCollect("hp");
tplayer.hp=atoi(_com_util::ConvertBSTRToString((_bstr_t)var));
var=recptr->GetCollect("mp");
tplayer.mp=atoi(_com_util::ConvertBSTRToString((_bstr_t)var));
var=recptr->GetCollect("attack");
tplayer.attack=atoi(_com_util::ConvertBSTRToString((_bstr_t)var));
var=recptr->GetCollect("defendence");
tplayer.defendence=atoi(_com_util::ConvertBSTRToString((_bstr_t)var));
var=recptr->GetCollect("celerity");
tplayer.celerity=atoi(_com_util::ConvertBSTRToString((_bstr_t)var));
var=recptr->GetCollect("occupation");
tplayer.ownOccup=(occupation)atoi(_com_util::ConvertBSTRToString((_bstr_t)var));
var=recptr->GetCollect("sex");
tplayer.ownSex=(sex)atoi(_com_util::ConvertBSTRToString((_bstr_t)var));
var=recptr->GetCollect("exp");
tplayer.exp=atoi(_com_util::ConvertBSTRToString((_bstr_t)var));
var=recptr->GetCollect("mapx");
tplayer.pos[0]=atoi(_com_util::ConvertBSTRToString((_bstr_t)var));
m_ol.pos[0]=tplayer.pos[0];
var=recptr->GetCollect("mapy");
tplayer.pos[1]=atoi(_com_util::ConvertBSTRToString((_bstr_t)var));
m_ol.pos[1]=tplayer.pos[1];
var=recptr->GetCollect("tael");
tplayer.money=atoi(_com_util::ConvertBSTRToString((_bstr_t)var));
var=recptr->GetCollect("lv");
tplayer.level=atoi(_com_util::ConvertBSTRToString((_bstr_t)var));
var=recptr->GetCollect("skill1");
tplayer.ownSkill[0]=_com_util::ConvertBSTRToString((_bstr_t)var);
var=recptr->GetCollect("skill2");
tplayer.ownSkill[1]=_com_util::ConvertBSTRToString((_bstr_t)var);
var=recptr->GetCollect("skill3");
tplayer.ownSkill[2]=_com_util::ConvertBSTRToString((_bstr_t)var);
var=recptr->GetCollect("skill4");
tplayer.ownSkill[3]=_com_util::ConvertBSTRToString((_bstr_t)var);
var=recptr->GetCollect("skill5");
tplayer.ownSkill[4]=_com_util::ConvertBSTRToString((_bstr_t)var);
var=recptr->GetCollect("skill6");
tplayer.ownSkill[5]=_com_util::ConvertBSTRToString((_bstr_t)var);
var=recptr->GetCollect("skill7");
tplayer.ownSkill[6]=_com_util::ConvertBSTRToString((_bstr_t)var);
var=recptr->GetCollect("equipname1");
tplayer.ownEquip[0]=_com_util::ConvertBSTRToString((_bstr_t)var);
var=recptr->GetCollect("equipname2");
tplayer.ownEquip[1]=_com_util::ConvertBSTRToString((_bstr_t)var);
var=recptr->GetCollect("equipname3");
tplayer.ownEquip[2]=_com_util::ConvertBSTRToString((_bstr_t)var);
var=recptr->GetCollect("objectname1");
tplayer.ownObject[0].ownObjectName=_com_util::ConvertBSTRToString((_bstr_t)var);
var=recptr->GetCollect("objectnum1");
tplayer.ownObject[0].num=atoi(_com_util::ConvertBSTRToString((_bstr_t)var));
var=recptr->GetCollect("objectname2");
tplayer.ownObject[1].ownObjectName=_com_util::ConvertBSTRToString((_bstr_t)var);
var=recptr->GetCollect("objectnum2");
tplayer.ownObject[1].num=atoi(_com_util::ConvertBSTRToString((_bstr_t)var));
var=recptr->GetCollect("objectname3");
tplayer.ownObject[2].ownObjectName=_com_util::ConvertBSTRToString((_bstr_t)var);
var=recptr->GetCollect("objectnum3");
tplayer.ownObject[2].num=atoi(_com_util::ConvertBSTRToString((_bstr_t)var));
var=recptr->GetCollect("objectname4");
tplayer.ownObject[3].ownObjectName=_com_util::ConvertBSTRToString((_bstr_t)var);
var=recptr->GetCollect("objectnum4");
tplayer.ownObject[3].num=atoi(_com_util::ConvertBSTRToString((_bstr_t)var));
var=recptr->GetCollect("objectnum4");
tplayer.ownObject[4].num=atoi(_com_util::ConvertBSTRToString((_bstr_t)var));
var=recptr->GetCollect("objectname5");
tplayer.ownObject[4].ownObjectName=_com_util::ConvertBSTRToString((_bstr_t)var);
var=recptr->GetCollect("objectnum5");
tplayer.ownObject[4].num=atoi(_com_util::ConvertBSTRToString((_bstr_t)var));
var=recptr->GetCollect("objectname6");
tplayer.ownObject[5].ownObjectName=_com_util::ConvertBSTRToString((_bstr_t)var);
var=recptr->GetCollect("objectnum6");
tplayer.ownObject[5].num=atoi(_com_util::ConvertBSTRToString((_bstr_t)var));
var=recptr->GetCollect("objectname7");
tplayer.ownObject[6].ownObjectName=_com_util::ConvertBSTRToString((_bstr_t)var);
var=recptr->GetCollect("objectnum7");
tplayer.ownObject[6].num=atoi(_com_util::ConvertBSTRToString((_bstr_t)var));
var=recptr->GetCollect("objectname8");
tplayer.ownObject[7].ownObjectName=_com_util::ConvertBSTRToString((_bstr_t)var);
var=recptr->GetCollect("objectnum8");
tplayer.ownObject[7].num=atoi(_com_util::ConvertBSTRToString((_bstr_t)var));
var=recptr->GetCollect("objectname9");
tplayer.ownObject[8].ownObjectName=_com_util::ConvertBSTRToString((_bstr_t)var);
var=recptr->GetCollect("objectnum9");
tplayer.ownObject[8].num=atoi(_com_util::ConvertBSTRToString((_bstr_t)var));
var=recptr->GetCollect("objectname10");
tplayer.ownObject[9].ownObjectName=_com_util::ConvertBSTRToString((_bstr_t)var);
var=recptr->GetCollect("objectnum10");
tplayer.ownObject[9].num=atoi(_com_util::ConvertBSTRToString((_bstr_t)var));
strcpy(m_ol.uName,sock->username);
vecOnLineRoles.push_back(m_ol);
//发送角色数信息数据大小
int datasize=sizeof(tplayer);
send(sock->socket,(char*)&datasize,sizeof(datasize),0);
//发送角色初始化信息数据
send(sock->socket,(char*)&tplayer,sizeof(tplayer),0);
recptr->Close();
recptr=NULL;
}
//创建角色函数
void doInitRole(_ConnectionPtr conn,vector<SocketInfo>&vecSockInfo,int idx)
{
SocketInfo* sockinfo=&vecSockInfo[idx];
player* temp=(player*)sockinfo->data;
char szSend[30];
memset(szSend,0,20);
char dbstr[1024];
memset(dbstr,0,1024);
_variant_t counts;
sprintf(dbstr,"insert into role (username,nickname,hp,mp,attack,defendence,celerity,occupation,sex,exp,mapx,mapy,tael,lv,\
skill1,skill2,skill3,skill4,skill5,skill6,skill7,equipname1,equipname2,equipname3,\
objectname1,objectnum1,objectname2,objectnum2,objectname3,objectnum3,objectname4,objectnum4,objectname5,objectnum5,\
objectname6,objectnum6,objectname7,objectnum7,objectname8,objectnum8,objectname9,objectnum9,objectname10,objectnum10)\
values ('%s','%s',%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,'%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s',%d,'%s',%d,'%s',%d,'%s',%d,'%s',%d,'%s',%d,'%s',%d,'%s',%d,'%s',%d,'%s',%d)",\
sockinfo->username,temp->nickName,temp->hp,temp->mp,temp->attack,temp->defendence,temp->celerity,temp->ownOccup,temp->ownSex,temp->exp,temp->pos[0],temp->pos[1],temp->money,temp->level,\
temp->ownSkill[0].c_str(),temp->ownSkill[1].c_str(),temp->ownSkill[2].c_str(),temp->ownSkill[3].c_str(),temp->ownSkill[4].c_str(),temp->ownSkill[5].c_str(),temp->ownSkill[6].c_str(),\
temp->ownEquip[0].c_str(),temp->ownEquip[1].c_str(),temp->ownEquip[2].c_str(),temp->ownObject[0].ownObjectName.c_str(),temp->ownObject[0].num,temp->ownObject[1].ownObjectName.c_str(),temp->ownObject[1].num,\
temp->ownObject[2].ownObjectName.c_str(),temp->ownObject[2].num,temp->ownObject[3].ownObjectName.c_str(),temp->ownObject[3].num,temp->ownObject[4].ownObjectName.c_str(),temp->ownObject[4].num,\
temp->ownObject[5].ownObjectName.c_str(),temp->ownObject[5].num,temp->ownObject[6].ownObjectName.c_str(),temp->ownObject[6].num,temp->ownObject[7].ownObjectName.c_str(),temp->ownObject[7].num,\
temp->ownObject[8].ownObjectName.c_str(),temp->ownObject[8].num,temp->ownObject[9].ownObjectName.c_str(),temp->ownObject[9].num);
conn->Execute(dbstr,&counts,adCmdText);
if(counts.intVal==1)
{
strcpy(szSend,"CR OK");
send(sockinfo->socket,szSend,sizeof(szSend),0);
}
else
{
strcpy(szSend,"CR ERR");
send(sockinfo->socket,szSend,sizeof(szSend),0);
}
delete[] sockinfo->data;
}
//验证处理函数
void doAuthen(_ConnectionPtr conn,vector<SocketInfo>&vecSockInfo,int idx)
{
_RecordsetPtr recdset;
SocketInfo *sockinfo=&vecSockInfo[idx];
char *pBuf=sockinfo->data;
int curidx=0;
char szName[20];
memset(szName,0,20);
char szPass[20];
memset(szPass,0,20);
while(*pBuf!=' ')
{
szName[curidx++]=*pBuf++;
}
szName[curidx]='\0';
*pBuf++;
curidx=0;
while(*pBuf!='\0')
{
szPass[curidx++]=*pBuf++;
}
szPass[curidx]='\0';
char szSend[30];
memset(szSend,0,30);
char cmdstr[256];
memset(cmdstr,0,256);
bool bUserExist=false;
recdset.CreateInstance(__uuidof(Recordset));
sprintf(cmdstr,"SELECT userpass FROM account WHERE username='%s'",szName);
if(conn!=NULL)
{
try
{
recdset->Open(cmdstr,conn.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
}catch(_com_error *e)
{
cout<<e->ErrorMessage()<<endl;
}
}
_variant_t var;
char* retpass;
try
{
if(!recdset->adoEOF)
{
recdset->MoveFirst();
}
else
{
strcpy(szSend,"U NONE");
send(sockinfo->socket,szSend,sizeof(szSend),0);
return;
}
var=recdset->GetCollect("userpass");
if(var.vt!=VT_NULL)
retpass=_com_util::ConvertBSTRToString((_bstr_t)var);
if(strcmp(szPass,retpass)==0)
{
strcpy(szSend,"UP OK");
send(sockinfo->socket,szSend,sizeof(szSend),0);
strcpy(sockinfo->username,szName);
sockinfo->isAuthen=true;
}
if(strcmp(szPass,retpass)!=0)
{
strcpy(szSend,"P ERR");
send(sockinfo->socket,szSend,sizeof(szSend),0);
}
}catch(_com_error *e)
{
cout<<e->ErrorMessage()<<endl;
}
delete[] sockinfo->data;
recdset->Close();
recdset=NULL;
}
//注册处理函数
void doReg(_ConnectionPtr conn,vector<SocketInfo>&vecSockInfo,int idx)
{
_RecordsetPtr recdset;
SocketInfo* sockinfo=&vecSockInfo[idx];
char *pBuf=sockinfo->data;
int curidx=0;
char szName[20];
memset(szName,0,20);
char szPass[20];
memset(szPass,0,20);
while(*pBuf!=' ')
{
szName[curidx++]=*pBuf++;
}
szName[curidx]='\0';
*pBuf++;
curidx=0;
while(*pBuf!='\0')
{
szPass[curidx++]=*pBuf++;
}
szPass[curidx]='\0';
//注册时,把用户名保存下来,为注册角色准备;
strcpy(sockinfo->username,szName);
variant_t counts;
char szSend[30];
char dbcom[256];
char dbselect[256];
memset(dbselect,0,256);
memset(szSend,0,30);
memset(dbcom,0,256);
//验证用户名不能重复
sprintf(dbselect,"select * from account where username='%s'",szName);
recdset=conn->Execute(dbselect,&counts,adCmdText);
if(!recdset->adoEOF)
{
strcpy(szSend,"ERR REPEAT");
send(sockinfo->socket,szSend,sizeof(szSend),0);
delete[] sockinfo->data;
return;
}
sprintf(dbcom,"insert into account (username,userpass) values('%s','%s')",szName,szPass);
recdset=conn->Execute(dbcom,&counts,adCmdText);
if(counts.intVal==1)
{
strcpy(szSend,"REG OK");
send(sockinfo->socket,szSend,sizeof(szSend),0);
}
else
{
strcpy(szSend,"REG ERR");
send(sockinfo->socket,szSend,sizeof(szSend),0);
}
delete[] sockinfo->data;
/*m_pRs=m_pCmd("insert ..."...) 不需要Close
//m_pRs=m_pCmd("select..."...) 需要Close
recdset->Close();会异常
*/
}
//打开数据库连接
_ConnectionPtr CreateConnection(const char * temp)
{
_ConnectionPtr conn;
conn.CreateInstance(__uuidof(Connection));
char connstr[80];
sprintf(connstr,"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=%s",temp);
//2007版的数据库支持
//Provider=Microsoft.ACE.OLEDB.12.0;Data Source="d:\xxx.accdb"
try
{
conn->Open(connstr,"","",adModeUnknown);
cout<<"已连接数据库!"<<endl;
}
catch(_com_error e)
{
cout<<"连接数据库失败,请确认数据库my.mdb是否在当前路径下!"<<endl;
return NULL;
}
return conn;
}
//比较数据库中,str1,str2
bool cmpInDBwithStr(const _ConnectionPtr& connPtr,char* str1,char* str2,DBopCmd dbop)
{
_RecordsetPtr recd;
return true;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -