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

📄 loginserver.cpp

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

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

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

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

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

LoginServer::~LoginServer()
{
}

void LoginServer::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;
	}
	
	sockfd=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
	if (sockfd<0)
	{
		printf("\nERROR: 家南阑 父甸荐 绝嚼聪促\n");
		printf("俊矾内靛 %i\n", WSAGetLastError());
		Gv->ServerON=0;
		return;
	}
	//setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on));
	
	memset((char *) &Serv, 0, len_connection_addr);
	Serv.sin_family=AF_INET;
	Serv.sin_addr.s_addr=htonl(INADDR_ANY);
	Serv.sin_port=htons(2011);
	printf("Wox2Login: 肺变 辑滚 立加阑 扁促覆 [酒捞乔:%s:器飘:%d]\n",inet_ntoa(Serv.sin_addr),ntohs(Serv.sin_port));
	bcode=bind(sockfd, (struct sockaddr *)&Serv, len_connection_addr);
	
	if (bcode<0)
	{
		printf("\nERROR: 家南阑 官牢靛 且荐 绝家 - 俊矾内靛: %i\n",bcode);
		Gv->ServerON = 0;
		return;
	}

	listen(sockfd, 42);
}


void LoginServer::Disconnect(int s)
{
	int j;
	
	closesocket(client[s]);
	
	for (j=s;j<now-1;j++)
	{
		client[j]=client[j+1];
	}
	now--;
	printf("Wox2Login: 努扼捞攫飘[%d]狼 立加捞 谗绢脸嚼聪促.\n",s);
}

int LoginServer::Receive(int s, int x, int a)
{
	int count;
	
	if (a) count=0; // Just to get rid of warning message
	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 LoginServer::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 LoginServer::GetMsg(int s)
{
	unsigned int i = 0;
	int id_size = 0 ;
	int pass_size = 0;
	int email_size = 0;
	char id[12] = "";
	char pass[12] = "";
	char email[30] = "";
	int encs = 0;
	char spr[] = "\xAA\x00\x11\x03\x8E\x55\x65\xD2\x27\x1B\x09\xB1\xCD\xBF\xAC\xB9\xCC\xB4\xCF\x00";
	int len = sizeof(struct sockaddr);
	int tempint;

	recvcount=0;
	if (Receive(s, 3, 0)>0)
	{
		if(!(buffer[s][0]=='\xAA'))
		{
			//printf( "沥惑楷搬捞 酒凑聪促");
			Disconnect( s );
			return;
		}
		int xt = Receive(s,2560,1);
		switch( buffer[s][3] )
		{
		case '\x00':
			fSend(s,"\xAA\x00\x07\x00\x00\x42\xF9\x1D\x63\x00");
			 break;

		case '\x02': // 货肺窍扁 stuff
			Xc->Dec_Pack(s,pack[s].mes);
			id_size = Messages[s][0];
			memcpy(id,Messages[s]+1,id_size);
			
			pass_size = Messages[s][id_size+1];
			memcpy(pass,Messages[s]+(id_size+2),pass_size);
			
			i = 0;
			while(!(i == Cc->acctcount))
			{	
				if(!strcmp(acctx[i].name,id))
				{
					encs = Xc->Enc_Pack( s,"\x03\x8酒叼乐绢",0x0A,0x02,2);
					break;
				}
				i++;
			}	
			if(encs < 1 )
			{
				Gv->latest_acctcount[client[s]] = Cc->acctcount;
				strcpy(acctx[Gv->latest_acctcount[client[s]]].name,id);
				strcpy(acctx[Gv->latest_acctcount[client[s]]].pass,pass);
				Cc->acctcount++;
				Cc->charcount++;
				Ci->itemcount++;
				Ch->Bagcount++;
				encs = Xc->Enc_Pack( s,"\x00\x00\x00\x00",4,0x02,2);				
			}
			Cc->acctcount++;
			Cc->charcount++;
			send(client[s],Encrypted_Messages[s],encs,0);
			break;			

		case '\x03':
			Xc->Dec_Pack(s,pack[s].mes);
			id_size = Messages[s][0];
			memcpy(id,Messages[s]+1,id_size);
			
			pass_size = Messages[s][id_size+1];
			memcpy(pass,Messages[s]+(id_size+2),pass_size);
			
			i = 0;
			while(1)
			{	
				if(!strcmp(acctx[i].name,id))
				{
					if(!strcmp(acctx[i].pass,pass))
					{
						if(acctx[i].login == true)
						{
							encs = Xc->Enc_Pack( s,"\x03\x0A捞固立加吝",12,0x02,2);
							send(client[s],Encrypted_Messages[s],encs,0);
							break;
						}

						fSend(s,"\xAA\x00\x05\x02\x04\x4A\x61\x7C");
						
						spr[4] = lit(sed.serverip,1);
						spr[5] = lit(sed.serverip,2);
						spr[6] = lit(sed.serverip,3);
						spr[7] = lit(sed.serverip,4);
						if(Gv->sockopen1 == true)
						{
						spr[8] = '\x09';
						spr[9] = '\xC5';
						Gv->sockopen1 = false;
						Gs->sockacc1 = i;
						getpeername(client[s],(struct sockaddr *)&Gs->dummyServ1.sin_addr,&len);

						}else if(Gv->sockopen2 == true)
						{
						spr[8] = '\x09';
						spr[9] = '\xC6';
						Gv->sockopen2 = false;
						Gs->sockacc2 = i;
						getpeername(client[s],(struct sockaddr *)&Gs->dummyServ2.sin_addr,&len);
						}
						spr[10] = id_size;
						memcpy(spr+11,id,id_size);

						send(client[s],spr,id_size+8+2+1,0);
						acctx[i].login = true;
						
					}
					else 
					{
						encs = Xc->Enc_Pack( s,"\x03\x08菩胶撇妨",10,0x02,2);
						send(client[s],Encrypted_Messages[s],encs,0);
						break;
					}
				}else if(i == Cc->acctcount)
				{
				encs = Xc->Enc_Pack( s,"\x03\x0A酒叼绝绢夸",12,0x02,2);
				send(client[s],Encrypted_Messages[s],encs,0);

				break;
				}
				i++;
			}
			break;			
		

		case '\x04'://货肺窍扁 2 stuff
			Xc->Dec_Pack(s,pack[s].mes);
			memset( (void *)&chr[Gv->latest_acctcount[client[s]]],0,sizeof(chr[Gv->latest_acctcount[client[s]]]));

			chr[Gv->latest_acctcount[client[s]]].body = Messages[s][0];
			chr[Gv->latest_acctcount[client[s]]].sex = Messages[s][2];
			chr[Gv->latest_acctcount[client[s]]].country = Messages[s][1];
			chr[Gv->latest_acctcount[client[s]]].sprit = Messages[s][3];
			strcpy(chr[Gv->latest_acctcount[client[s]]].ClanName,"绝绢");
			strcpy(chr[Gv->latest_acctcount[client[s]]].ClanTitle,"绝绢");
			strcpy(chr[Gv->latest_acctcount[client[s]]].Title,"绝绢");
			chr[Gv->latest_acctcount[client[s]]].Str = 3;
			chr[Gv->latest_acctcount[client[s]]].Dex = 3;
			chr[Gv->latest_acctcount[client[s]]].Int = 3;
			tempint = Ti->Roll(10)+100;
			chr[Gv->latest_acctcount[client[s]]].HitPoint = tempint;
			chr[Gv->latest_acctcount[client[s]]].MaxHitPoint = tempint;
			tempint = Ti->Roll(10)+100;
			chr[Gv->latest_acctcount[client[s]]].ManaPoint = tempint;
			chr[Gv->latest_acctcount[client[s]]].MaxManaPoint = tempint;
			chr[Gv->latest_acctcount[client[s]]].Lv = 1;
			chr[Gv->latest_acctcount[client[s]]].mapx = 10;
			chr[Gv->latest_acctcount[client[s]]].mapy = 7;
			chr[Gv->latest_acctcount[client[s]]].lastmap = 0;
			chr[Gv->latest_acctcount[client[s]]].e_armo = 0xFF;
			chr[Gv->latest_acctcount[client[s]]].e_block= 0xFF;
			chr[Gv->latest_acctcount[client[s]]].e_helm = 0xFF;
			chr[Gv->latest_acctcount[client[s]]].e_weap = 0xFF;
			chr[Gv->latest_acctcount[client[s]]].e_etc1 = 0xFF;
			chr[Gv->latest_acctcount[client[s]]].e_weap = 0xFF;
			chr[Gv->latest_acctcount[client[s]]].Money = 0;
			encs = Xc->Enc_Pack( s,"\x00\x0A捞绢窍扁秦",0x0C,0x02,2);
			send(client[s],Encrypted_Messages[s],encs,0);
			break;
		
		case '\x10':
			fSend(s,"\xAA\x00\x0C\x60\x00\x4E\x62\x95\x51\x91\x49\x6E\x6B\x46\x4F");
			break;
	
		case '\x4B':
			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);
	}
//	memset((void*)&buffer[s],0,sizeof(buffer[s]));
}

void LoginServer::ConnReq()
{
	int s; int len;
	
	if (now<MAXCLIENT)
	{
		FD_ZERO(&conn);
		FD_SET(sockfd, &conn);
		nfds=sockfd+1;
		s=select(nfds, &conn, NULL, NULL, &Ti->timeout);
		if (s>0)
		{
			len=sizeof (struct sockaddr_in);
			client[now]=accept(sockfd, (struct sockaddr *)&Serv, &len);
			if (client[now]<0)
			{
				printf("ERROR: 努扼捞攫飘 楷搬俊 巩力啊 惯积!\n");
				Gv->ServerON=0;
				return;
			}
			server[now]=-1;
			binlength[now]=0;
			boutlength[now]=0;
			struct sockaddr_in sock_addr_in;
			getpeername(client[now],(struct sockaddr *)&sock_addr_in,&len);
			printf("Wox2Login: Client %i [%s:%d] 楷搬沁嚼聪促 [醚:%i疙].\n",now,inet_ntoa(sock_addr_in.sin_addr),ntohs(sock_addr_in.sin_port),now+1);
			printf("Wox2Login: Server %i [%s:%d] 促澜措扁 [醚:%i疙].\n",MAXCLIENT-now,inet_ntoa(Serv.sin_addr),ntohs(Serv.sin_port),now+1);
			
			//connected to server
			CK2[now] = 0;
			fSend(now,"\xAA\x00\x13\x7E\x1B\x43\x4F\x4E\x4E\x45\x43\x54\x45\x44\x20\x53\x45\x52\x56\x45\x52\x0A");
			now++;
			return;
		}
		if (s<0)
		{
			printf("WoxServerList: Select (Conn) failed!\n");
			Gv->ServerON=0;
			return;
		}
		
	}
}

void LoginServer::SockClose () // Close all sockets for shutdown
{
	int i;
	closesocket(sockfd);
	for (i=0;i<now;i++) closesocket(client[i]);
}

⌨️ 快捷键说明

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