⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 server.cpp

📁 改工程是一个基于select模型实现的MUD游戏
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		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 + -