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

📄 gameserver.cpp

📁 国外网络游戏 《The Kingdom of the Winds》 的服务端源码C+编写 有兴趣的可以
💻 CPP
字号:
// GameServer.cpp: implementation of the GameServer class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Wox2head.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

GameServer::GameServer()
{
	sockinit();
	now = 0;
	FD_ZERO(&conn);
}

GameServer::~GameServer()
{

}

void GameServer::sockinit()
{
	int bcode;	int on=1, off=0;
	int len_connection_addr=sizeof (struct sockaddr_in);
	WSADATA w;
	
	if (WSAStartup(0x202, &w))
	{
		printf("\nWinsock 2.0 捞惑捞 鞘夸钦聪促(win95俊辑 诀单捞飘 鞘夸)...\n");
		Gv->ServerON=0;
		return;
	}
	
	sockfd1=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	sockfd2=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if ((sockfd1<0)||(sockfd2<0))
	{
		printf("\nERROR: 家南阑 父甸荐 绝嚼聪促\n");
		printf("俊矾内靛 %i\n", WSAGetLastError());
		Gv->ServerON=0;
		return;
	}
	//setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on));
	
	memset((char *) &Serv1, 0, len_connection_addr);
	memset((char *) &Serv2, 0, len_connection_addr);
	Serv1.sin_family=AF_INET;
	Serv1.sin_addr.s_addr=htonl(INADDR_ANY);
	Serv1.sin_port=htons(2501);
	
	Serv2.sin_family=AF_INET;
	Serv2.sin_addr.s_addr=htonl(INADDR_ANY);
	Serv2.sin_port=htons(2502);
	printf("Wox2Game1: 霸烙 辑滚1 立加阑 扁促覆 [酒捞乔:%s:器飘:%d]\n",inet_ntoa(Serv1.sin_addr),ntohs(Serv1.sin_port));
	printf("Wox2Game2: 霸烙 辑滚2 立加阑 扁促覆 [酒捞乔:%s:器飘:%d]\n",inet_ntoa(Serv2.sin_addr),ntohs(Serv2.sin_port));
	bcode=bind(sockfd1, (struct sockaddr *)&Serv1, len_connection_addr);
	bcode=bind(sockfd2, (struct sockaddr *)&Serv2, len_connection_addr);
	
	if (bcode<0)
	{
		printf("\nERROR: 家南阑 官牢靛 且荐 绝家 - 俊矾内靛: %i\n",bcode);
		Gv->ServerON = 0;
		return;
	}

	listen(sockfd1, 42);
	listen(sockfd2, 42);
}

void GameServer::ConnReq1()
{
	int s; int len;
	
	if (now<MAXCLIENT)
	{
		FD_ZERO(&conn);
		FD_SET(sockfd1, &conn);
		nfds=sockfd1+1;
		s=select(nfds, &conn, NULL, NULL, &Ti->timeout);
		if (s>0)
		{
			len=sizeof (struct sockaddr_in);
			client[now]=accept(sockfd1, (struct sockaddr *)&Serv1, &len);
			struct sockaddr_in sock_addr_in;
			getpeername(client[now],(struct sockaddr *)&sock_addr_in,&len);
			
			if (client[now]<0)
			{
				printf("ERROR: 努扼捞攫飘 楷搬俊 巩力啊 惯积!\n");
				Gv->ServerON=0;
				return;
			}

			server[now]=-1;
			binlength[now]=0;
			boutlength[now]=0;
			printf("Wox2Game1: Client %i [%s:%d] 楷搬沁嚼聪促 [醚:%i疙].\n",now,inet_ntoa(sock_addr_in.sin_addr),ntohs(sock_addr_in.sin_port),now+1);
			printf("Wox2Game1: Server %i [%s:%d] 促澜措扁 [醚:%i疙].\n",MAXCLIENT-now,inet_ntoa(Serv1.sin_addr),ntohs(Serv1.sin_port),now+1);
			if(Gv->sockopen1 == true||strcmp(inet_ntoa(dummyServ1.sin_addr),inet_ntoa(sock_addr_in.sin_addr)))
			{
				printf("WOXBLOCK: 何沥楷搬\n");
				Disconnect(s);
				return;
			}

			
			//connected to server
			CK3[now] = 0;
			
			acc[now] = sockacc1;
			

//\xAA\x00\x04\x20\x01\x5B\x46 x
/*\xAA\x00\x0E\x05\x04\x4A\x65\xF7\xE3\x6A\x4D\x6A\x65\x2A\x4B\x60\x7D\ 
//\xAA\x00\x20\x15\x05\x5C\xFC\x7D\x74\x6B\x58\x6F\x66\x39\xF2\xDA\xBB\xA4\xDB\xAF\xDF\xD2\x95\xA5\xDB\xB3\xA8\xAE\xF7\x8F\x55\x1B\x48\x63\x7E\
//\xAA\x00\x0B\x04\x06\x48\x64\x7E\x63\x68\x48\x68\x62\x28\
//\xAA\x00\x1F\x33\x07\x49\x65\x7F\x62\x68\x4E\x6D\x51\x97\x48\x63\x7E\x55\x68\x4F\x97\x9A\x28\x41\xDC\x87\xD1\x8C\x8E\xC4\xAE\xDA\x8F\xA3\
//\xAA\x00\x1B\x33\x08\x46\x7D\x70\x6F\x67\x41\x62\x04\x11\x47\x6C\x71\x57\x67\x40\x98\x95\x27\x42\xAF\xBC\xDA\x91\x83\xA8\
//\xAA\x00\x11\x07\x09\x47\x6D\x71\x69\x67\x45\x67\x6A\x27\x40\xED\x37\x63\x64\x41\
//\xAA\x00\x03\x1F\x0A\x44\
\xAA\x00\x32\x08\x0B\x3D\x6F\x73\x64\x64\x42\x65\x68\x13\x44\x6F\x72\x44\x67\x40\x67\x6A\x27\x47\x6C\x12\xC0\x6B\xF9\x67\x6A\x27\x70\x6D\x70\x67\x47\x41\x66\x6B\x27\x41\x6A\x77\x60\x61\x46\x61\x6C\x21\x40\x6B\x76\
\xAA\x00\x1D\x33\x0C\x42\x6E\x74\x69\x60\x45\x66\xE4\xAA\x43\x69\x75\x22\x63\x44\x9C\x91\x23\x48\xDA\xBB\xDE\xCC\xFE\xAC\xD9\xEF\xAA\x00\x04\x49\x0D\x43\x68\*/
//\xAA\x00\x92\x30\x0E\x40\x6A\x76\x61\x74\x48\x61\x6C\xA0\x42\x69\x76\xE0\x62\x45\x60\x57\x21\x43\x69\x75\x63\x1B\xF1\x89\xDB\xFE\x8B\x9F\x55\xA3\xBC\xFB\x87\xA9\xEC\xFB\xAF\xC6\xAA\x44\xF0\xC5\xD8\xCA\x84\x98\x53\xA4\xB5\xFC\x8B\x48\xE4\x90\xD1\xCC\xD8\x82\x60\x46\xD1\xD5\xFE\x94\xB9\x91\x47\xF9\xB8\xD1\xDA\x8F\xAC\xCA\xAB\x48\xF1\xAE\xA5\xE4\xFC\x92\x5F\xAF\xB1\x8B\xDE\xA4\x92\x6A\xD8\xB0\xD4\xC6\xF2\xCB\x47\x93\xAD\xA1\x8B\xAD\xA4\xFD\x89\x46\xEB\xEB\xA0\xA2\x4D\xDA\x8C\xAB\xAE\x9F\xE7\
//\xA6\xBC\x4C\xD7\xBB\xD4\x98\xED\xFB\x4B\xCA\xA3\xA6\x84\xA7\xB5\x9E\x90\x44\xBE\xBB\xDB\x87\xDB\xBB\x01\
//\xAA\x00\x0A\x08\x0F\x49\x6A\x77\x60\x61\x46\x61\x6C\
//\xAA\x00\x0A\x08\x10\x56\x75\x68\x7F\x7E\x59\x7E\x73
			//1E:06 00 ??
//			encs = Xc->Enc_Pack(now,"\x06\x00",2,0x1E,3);
//			send(client[now],Encrypted_Messages[now],encs,0);
			
			
//			Cw->SendMiniText( now,10,"窍窍抛胶飘");
//			Cw->SendMiniText( now,10,"窍窍抛胶飘");
						
			//encs = Xc->Enc_Pack(now,"\x00\x01\x00\x0F\x00\x05\x00\x00\x00\xCC\x80\x47\x04\x02\x00",sizeof("\x00\x01\x00\x0F\x00\x05\x00\x00\x00\xCC\x80\x47\x04\x02\x00"),0x07,3);
			//send(client[now],Encrypted_Messages[now],encs,0);

			//encs = Xc->Enc_Pack(now,"\x00",1,0x1F,3);
			//send(client[now],Encrypted_Messages[now],encs,0);
			//send(client[now],"\xAA\x00\x03\x1F\x0A\x44",sizeof("\xAA\x00\x03\x1F\x0A\x44")-1,0);

			//磊脚狼 某腐磐甫 舅妨霖促 ->//fSend(now,"\xAA\x00\x0E\x05\x04\x4A\x65\xF7\xE3\x6A\x4D\x6A\x65\x2A\x4B\x60\x7D");
			//fSend(now,"\xAA\x00\x1F\x33\x07\x49\x65\x7F\x62\x68\x4E\x6D\x51\x97\x48\x63\x7E\x55\x68\x4F\x97\x9A\x28\x41\xDC\x87\xD1\x8C\x8E\xC4\xAE\xDA\x8F\xA3");
			//fSend(now,"\xAA\x00\x1B\x33\x08\x46\x7D\x70\x6F\x67\x41\x62\x04\x11\x47\x6C\x71\x57\x67\x40\x98\x95\x27\x42\xAF\xBC\xDA\x91\x83\xA8");
			// 档快固 NPC ->//fSend(now,"\xAA\x00\x11\x07\x09\x47\x6D\x71\x69\x67\x45\x67\x6A\x27\x40\xED\x37\x63\x64\x41");
			//fSend(now,"\xAA\x00\x92\x30\x0E\x40\x6A\x76\x61\x74\x48\x61\x6C\xA0\x42\x69\x76\xE0\x62\x45\x60\x57\x21\x43\x69\x75\x63\x1B\xF1\x89\xDB\xFE\x8B\x9F\x55\xA3\xBC\xFB\x87\xA9\xEC\xFB\xAF\xC6\xAA\x44\xF0\xC5\xD8\xCA\x84\x98\x53\xA4\xB5\xFC\x8B\x48\xE4\x90\xD1\xCC\xD8\x82\x60\x46\xD1\xD5\xFE\x94\xB9\x91\x47\xF9\xB8\xD1\xDA\x8F\xAC\xCA\xAB\x48\xF1\xAE\xA5\xE4\xFC\x92\x5F\xAF\xB1\x8B\xDE\xA4\x92\x6A\xD8\xB0\xD4\xC6\xF2\xCB\x47\x93\xAD\xA1\x8B\xAD\xA4\xFD\x89\x46\xEB\xEB\xA0\xA2\x4D\xDA\x8C\xAB\xAE\x9F\xE7
//\xA6\xBC\x4C\xD7\xBB\xD4\x98\xED\xFB\x4B\xCA\xA3\xA6\x84\xA7\xB5\x9E\x90\x44\xBE\xBB\xDB\x87\xDB\xBB\x01");
//			fSend(now,"\xAA\x00\x0A\x08\x0F\x49\x6A\x77\x60\x61\x46\x61\x6C");
//			fSend(now,"\xAA\x00\x0A\x08\x10\x56\x75\x68\x7F\x7E\x59\x7E\x73");
			//fSend(now,"\xAA\x00\x32\x08\x0B\x3D\x6F\x73\x64\x64\x42\x65\x68\x13\x44\x6F\x72\x44\x67\x40\x67\x6A\x27\x47\x6C\x12\xC0\x6B\xF9\x67\x6A\x27\x70\x6D\x70\x67\x47\x41\x66\x6B\x27\x41\x6A\x77\x60\x61\x46\x61\x6C\x21\x40\x6B\x76");
			//fSend(now,"\xAA\x00\x1D\x33\x0C\x42\x6E\x74\x69\x60\x45\x66\xE4\xAA\x43\x69\x75\x22\x63\x44\x9C\x91\x23\x48\xDA\xBB\xDE\xCC\xFE\xAC\xD9\xEF");
						
			//Cw->SendMapCharsOther(now);
			
			//fSend(now,"\xAA\x00\x04\x20\x01\x5B\x46");
			//Cw->SendCurXY(now);

			SendFirst(now);			
						
			now++;
			Gv->sockopen1 = true;
			sockacc1 = 0;
			memset((void *)&dummyServ1,1,sizeof(struct sockaddr));
			return;
		}
		if (s<0)
		{
			printf("Wox2Game1: Select (Conn) failed!\n");
			Gv->ServerON=0;
			return;
		}
		
	}
}
void GameServer::ConnReq2()
{
	int s; int len;
	
	if (now<MAXCLIENT)
	{
		FD_ZERO(&conn);
		FD_SET(sockfd2, &conn);
		nfds=sockfd2+1;
		s=select(nfds, &conn, NULL, NULL, &Ti->timeout);
		if (s>0)
		{
			len=sizeof (struct sockaddr_in);
			client[now]=accept(sockfd2, (struct sockaddr *)&Serv2, &len);
			struct sockaddr_in sock_addr_in;
			getpeername(client[now],(struct sockaddr *)&sock_addr_in,&len);
			
			if (client[now]<0)
			{
				printf("ERROR: 努扼捞攫飘 楷搬俊 巩力啊 惯积!\n");
				Gv->ServerON=0;
				return;
			}
			server[now]=-1;
			binlength[now]=0;
			boutlength[now]=0;
			
			printf("Wox2Game2: Client %i [%s:%d] 楷搬沁嚼聪促 [醚:%i疙].\n",now,inet_ntoa(sock_addr_in.sin_addr),ntohs(sock_addr_in.sin_port),now+1);
			printf("Wox2Game2: Server %i [%s:%d] 促澜措扁 [醚:%i疙].\n",MAXCLIENT-now,inet_ntoa(Serv2.sin_addr),ntohs(Serv2.sin_port),now+1);
			
			//connected to server
			CK3[now] = 0;

			acc[now] = sockacc2;

			SendFirst(now);
			now++;
			Gv->sockopen2 = true;
			memset((void *)&dummyServ2,1,sizeof(struct sockaddr));
			return;
		}
		if (s<0)
		{
			printf("Wox2Game2: Select (Conn) failed!\n");
			Gv->ServerON=0;
			return;
		}
		
	}
}


void GameServer::CheckMessage()
{
	int s, i, oldnow;
	
	FD_ZERO(&all);
	FD_ZERO(&errsock);
	nfds=0;
	for (i=0;i<now;i++)
	{
		FD_SET(client[i],&all);
		FD_SET(client[i],&errsock);
		if (client[i]+1>nfds) nfds=client[i]+1;
		if (server[i]>=0)
		{
			FD_SET(server[i],&all);
			FD_SET(server[i],&errsock);
			if (server[i]+1>nfds) nfds=server[i]+1;
		}
	}
	s=select(nfds, &all, NULL, &errsock, &Ti->timeout);
	if (s>0)
	{
		oldnow=now;
		for (i=0;i<now;i++)
		{
			if (FD_ISSET(client[i],&errsock))
			{
				Disconnect(i);
			}
			if (server[i] >= 0) {
				if (FD_ISSET(server[i],&errsock))
				{
					closesocket(server[i]);
//					FailAuth(i);
				}
			}
			if ((FD_ISSET(client[i],&all))&&(oldnow==now))
			{
				GetMsg(i);
//				if (executebatch) batchcheck(i); //LB, bugfix (uncommenting this line) for server info 
				// not working and much more scripted things
				// it's an odd place to do that check
				// feel free to place it straticaly better,
				// but DONT leave it out, that breaks a LOT !!!!
				// (whoever commented it out, it took me hours to find it, grrr)
				
				
			}
			if (server[i] >= 0)
			{
				if ((FD_ISSET(server[i],&all))&&(oldnow==now))
				{
//					AuthTest(i);
				}
			}
		}
	}
}

void GameServer::GetMsg(int s)
{
	int encs = 0;

	recvcount=0;
	if (Receive(s, 3, 0)>0)
	{
		if(!(buffer[s][0]=='\xAA'))
		{
			Disconnect( s );
			return;
		}
		int xt = Receive(s,2560,1);
		switch( buffer[s][3] )
		{
		case '\x06': //捞悼窍扁
			Xc->Dec_Pack(s,pack[s].mes);
			Cw->WalkThrow(s,Messages[s]);
			break;
		case '\x08': //滚府扁
			Xc->Dec_Pack(s,pack[s].mes);
			Ci->ThrowItem(s,Messages[s][0]);
			break;

		case '\x0E': //富窍扁 (傍俺 富窍扁)
			Xc->Dec_Pack(s,pack[s].mes);
			Cw->Say(s,Messages[s]);
			break;

		case '\x11': //媚促焊扁
			Xc->Dec_Pack(s,pack[s].mes);
			Cw->SendCharSide(s,Messages[s][0]);
			break;

		case '\x13': //傍拜窍扁
			Cw->NormalAttack(s);
			break;

		case '\x1D': //皑沥钎泅
			Xc->Dec_Pack(s,pack[s].mes);
			Cw->SendCharEmotion(s,Messages[s]);
			break;

		case '\x32': //捞悼窍扁
			Xc->Dec_Pack(s,pack[s].mes);
			Cw->WalkChar(s,Messages[s]);
			break;		
			
		default:
			FD_ZERO(&all);
			FD_SET(client[s],&all);
			nfds=client[s]+1;
			if (select(nfds, &all, NULL, NULL, &Ti->timeout)>0)
			{
				Receive(s, 2560, 1);
			}
		printf("舅荐绝绰 皋矫瘤: 辨捞[%x] 疙飞[%x] 鞠龋拳[%x]\n", buffer[s][3], buffer[s][4],buffer[s][5] );
		break;
		}
	}
	else
	{
		Disconnect(s);
	}
}

int GameServer::Receive(int s, int x, int a)
{
	int count;
	
	if (a) count=0;
	do
	{
		count=recv(client[s], (char *)&buffer[s][recvcount], x-recvcount, 0);
		memcpy((char *)&pack[s]+recvcount,(char *)&buffer[s][recvcount],x-recvcount);
		if (count>0)
		{
			recvcount+=count;
		}
	}
	while ((x!=2560)&&(x!=recvcount)&&(count>0));
	return count;
}

void GameServer::Disconnect(int s)
{
	int j;
	
	acctx[Gs->acc[s]].login = false;

	closesocket(client[s]);
	Cw->DeleteObjectChar(s);
	for (j=s;j<now;j++)
	{
		client[j]=client[j+1];
		acc[j] = acc[j+1];
		CK3[j] = CK3[j+1];
	}
	now--;
	
	printf("Wox2Game: 努扼捞攫飘[%d]狼 立加捞 谗绢脸嚼聪促.\n",s);
}

void GameServer::SendFirst(int now)
{
	int encs = 0;

	fSend(now,"\xAA\x00\x05\x1E\x00\x48\x65\x78");
	CK3[now] = 1;Cw->SendCurTime(now);
	Cw->SendMiniText(now,"固聪罚靛俊 坷脚巴阑 券康钦聪促");
	Cw->SendMiniText(now,"===泅犁 抛胶飘扁埃==");
			
	CK3[now] = 4;Cw->SendCharNumb(now);
			
			
	Cw->SendMapTitle(now);
	fSend(now,"\xAA\x00\x0B\x04\x06\x48\x64\x7E\x63\x68\x48\x68\x62\x28");
			
	CK3[now] = 7;
	encs = Xc->Enc_Pack(now,"\x00",1,0x1F,3);
	send(client[now],Encrypted_Messages[now],encs,0);
	Cw->SendExistFirst(now);

	Cw->SendCurXY(now);
	Cw->SendStatus(now);
	Cw->SendMapCharsOther(now);
			
	encs = Xc->Enc_Pack(now,"\x00\x00",2,0x49,3);
	send(client[now],Encrypted_Messages[now],encs,0);
						

	encs = Xc->Enc_Pack(now,"\x08\x00\x00\x00\x00\x00\x00\x00",sizeof("\x08\x00\x00\x00\x00\x00\x00\x00"),0x08,3);
	send(client[now],Encrypted_Messages[now],encs,0);
			
	encs = Xc->Enc_Pack(now,"\x08\x00\x00\x00\x00\x00\x00\x00",sizeof("\x08\x00\x00\x00\x00\x00\x00\x00"),0x08,3);
	send(client[now],Encrypted_Messages[now],encs,0);
	
	Ci->SendItemBox(now);
	Cw->Equip(now,"a");
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -