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

📄 serverlist.cpp

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

#include "stdafx.h"
#include "Wox2Head.h"

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

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

ServerList::ServerList()
{
	//檬扁拳
	now = 0;
	sockinit();
	FD_ZERO(&conn);
}

ServerList::~ServerList()
{

}

void ServerList::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(2010);
	printf("Wox2List: 辑滚府胶飘 立加阑 扁促覆 [酒捞乔:%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 ServerList::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("Wox2List: Client %i [%s:%d] 楷搬沁嚼聪促 [醚:%i疙].\n",now,inet_ntoa(sock_addr_in.sin_addr),ntohs(sock_addr_in.sin_port),now+1);
			printf("Wox2List: Server %i [%s:%d] 促澜措扁 [醚:%i疙].\n",MAXCLIENT-now,inet_ntoa(Serv.sin_addr),ntohs(Serv.sin_port),now+1);
			
			//connected to server
			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("Wox2List: Select (Conn) failed!\n");
			Gv->ServerON=0;
			return;
		}
		
	}
}
void ServerList::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 ServerList::Disconnect(int s)
{
	int j;
	
	closesocket(client[s]);
	
	for (j=s;j<now-1;j++)
	{
		client[j]=client[j+1];
	}
	now--;
	printf("Wox2List: 努扼捞攫飘[%d]狼 立加捞 谗绢脸嚼聪促.\n",s);

}

int ServerList::Receive(int s, int x, int a) // Old socket receive function (To be replaced soon)
{
	//	int i, count;
	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 ServerList::GetMsg(int s) // Receive message from client //Lag Fix -- Zippy
{
	recvcount=0;
	char buf[] = "\xAA\x00\x09\x03\x07\x55\x65\xD2\x07\xDB\x00\x00";

	if (Receive(s, 3, 0)>0)
	{
		if(!(pack[s].head[0] == '\xAA'))
		{
			printf("Wox2List: 沥惑楷搬捞 酒凑聪促 [%d]\n",s);
			Disconnect( s );
			return;
		}
		int xx = Receive(s,2560,1);
		switch( buffer[s][3] ) //pack[s].mes[1]
		{
		case '\x00':
			fSend(s,"\xAA\x00\x07\x00\x00\x42\xF9\x1D\x63\x00");
			break;
		case '\x10':
			fSend(s,"\xAA\x00\x0C\x60\x00\x4E\x62\x95\x51\x91\x49\x6E\x6B\x46\x4F");
			
		case '\x57':
			Xc->Dec_Pack(s,pack[s].mes);			
			if(Messages[s][0] == '\x00')
			{
				buf[3] = 0x03;
				buf[4] = lit(sed.serverip,1);
				buf[5] = lit(sed.serverip,2);
				buf[6] = lit(sed.serverip,3);
				buf[7] = lit(sed.serverip,4);
 				//memcpy(buf+4,(char *)&Gv->ipl,4);
				fSend(s,buf);
			} else if(Messages[s][0] == '\x01')
			{
/*				fSend(s,"\xAA\x00\xB7\x56\x00\x4E\xD6\x00\xF3\x8D\
\x29\xFA\x6B\x67\xF2\xA0\x07\x05\x88\xA2\x7C\x6D\x82\xC1\x6B\x76\
\x61\x5A\x74\x3E\x51\xF6\xB2\x35\x1A\xA3\xB7\x17\x72\x97\xC3\x18\
\xB9\x07\x93\xAA\x20\x6C\x81\xC3\xEA\x40\x58\x6D\xBD\xA3\x33\x61\
\x78\x2A\xED\xD8\xED\xC1\x58\xC4\x01\xE7\xD7\x8F\x40\x19\x40\x2F\
\xD8\x65\x72\x32\x91\xB6\xE9\xD1\x71\x43\xED\xCE\x71\xDD\xCB\x27\
\x7B\xB3\x05\x89\x2A\x18\x05\x66\x51\x70\x41\xD8\xE8\x26\x7E\xD1\
\x5A\x0C\x57\x72\xED\xEA\x88\x9F\xD6\xB2\xB9\xB2\x97\xB0\x63\x8A\
\x99\x6C\xB8\x22\xD5\x44\xEB\xCB\xC4\x4F\xB7\x74\x78\x08\x4F\x91\
\xB0\xE6\x36\x6D\xC8\x49\x8D\x1A\xDC\x91\x80\x9C\x8B\x6B\xB8\x71\
\x68\x5A\xC0\xBD\x12\xAD\xD1\x84\xBF\x22\xB3\x52\xEF\x5C\xDE\x51\
\x07\x01\xB4\xD2\x12\xD7\x1D\xE0\x01\x4E\x7D\x5A\xF0\x38\xA2\x36");*/
				buf[3] = 0x03;
				buf[4] = lit(sed.serverip,1);
				buf[5] = lit(sed.serverip,2);
				buf[6] = lit(sed.serverip,3);
				buf[7] = lit(sed.serverip,4);
 				//memcpy(buf+4,(char *)&Gv->ipl,4);
				fSend(s,buf);
			}
			
			break;

		case '\x62':
			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][2], buffer[s][3],buffer[s][4] );
		break;
		}
	}
	else	// Sortta error type thing, they disconnected already
	{
		Disconnect(s);
	}
}
void ServerList::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 + -