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

📄 frmmain.cs

📁 网络游戏征服的服务端部分完整源码 VC编译 绝少的源码 有兴趣的可以
💻 CS
📖 第 1 页 / 共 2 页
字号:
				}
				else //Invalid password
				{
					byte[] Reply = PacketBuilder.NoAuthenticate();
					ClientData.Client.Crypto.Encrypt(ref Reply);
					m_AuthServer.SendRawData(sRemoteAddress, nRemotePort, Reply);

					m_AuthServer.DropClient(sRemoteAddress, nRemotePort);
				}

			}
			else if (Data[0] == 0x1c && Data[1] == 0x00 && Data[2] == 0x1c && Data[3] == 0x04) //This is the second packet: the authenticated response
			{
				//We need to just drop the client from the auth server
				Console.WriteLine("Successful authentication from " + sRemoteAddress + ":" + nRemotePort);
				ClientData.Client.Crypto = null;
				m_AuthServer.DropClient(sRemoteAddress, nRemotePort);
			}
			else
			{
				Console.WriteLine("Unknown packet on Auth server");
#if DEBUG
				Console.WriteLine("Unknown packet on Auth server");
#endif
				m_AuthServer.DropClient(sRemoteAddress, nRemotePort);
			}
			pData = null;
		}

		public void GameConnectionFilter(String sRemoteAddress, int nRemotePort, Socket sock)
		{
			//TODO: Add C#/SQL code to check for banned IPs
			Console.WriteLine("Incoming game connection request from " + sRemoteAddress + ":" + nRemotePort.ToString());
		
			//m_GameConnectedClients.Add(sock.RemoteEndPoint.ToString(), null);
			lstClients.Items.Add(sock.RemoteEndPoint.ToString());
		}

		public void GameExceptionHandler(Exception oBug, Socket sock)
		{

			COClient Drops;
#if DEBUG
			Console.WriteLine("Game Server: An exception of type \"" + oBug.Message + "\" has occured.");
			if (oBug.InnerException != null)
				Console.WriteLine("\tInner Exception: \"" + oBug.InnerException.Message + "\".");
			Console.WriteLine("Game Server: An exception of type \"" + oBug.Message + "\" has occured.");
			if (oBug.InnerException != null)
				Console.WriteLine("\tInner Exception: \"" + oBug.InnerException.Message + "\".");
#endif

			if (sock != null)
			{
				
				if (m_GameConnectedClients.Contains(sock.RemoteEndPoint.ToString()))
				{
					if (((AuthBinder)m_GameConnectedClients[sock.RemoteEndPoint.ToString()]).Client.Status == Mode.World)
						World.DropClient(((AuthBinder)m_GameConnectedClients[sock.RemoteEndPoint.ToString()]).Client, oBug.ToString());
					Drops = ((AuthBinder)m_GameConnectedClients[sock.RemoteEndPoint.ToString()]).Client;
					m_GameConnectedClients.Remove(sock.RemoteEndPoint.ToString());
					lstClients.Items.Remove(Drops);
				}
				//lstClients.Items.Remove(sock.RemoteEndPoint.ToString());
				//m_GameServer.DropClient(sock.RemoteEndPoint.ToString().Split(':')[0], Convert.ToInt32(sock.RemoteEndPoint.ToString().Split(':')[1]));
			}
		}
		public void GameInputHandler(String sRemoteAddress, int nRemotePort, Byte[] pData)
		{
			System.Threading.Monitor.Enter(pData);
			byte [] Data = new byte[pData.Length];
			pData.CopyTo(Data, 0);
			System.Threading.Monitor.Exit(pData);
			AuthBinder ClientData;
			
			if (m_GameConnectedClients.Contains(sRemoteAddress + ":" + nRemotePort))
			{
				ClientData = (AuthBinder)m_GameConnectedClients[sRemoteAddress + ":" + nRemotePort];
				ClientData.Client.IncomingPacket(Data);
			}
			else
			{
				Cryptographer CryptoTemp = new Cryptographer();
				CryptoTemp.Decrypt(ref Data);
				byte [] Reply;
				ulong Keys;
				if (Data[0] == 0x1c && Data[1] == 0x00 && Data[2] == 0x1c && Data[3] == 0x04) //This is the initial logon/language packet
				{
					Keys = Data[11];
					Keys = (Keys << 8) | Data[10];
					Keys = (Keys << 8) | Data[9];
					Keys = (Keys << 8) | Data[8];
					Keys = (Keys << 8) | Data[7];
					Keys = (Keys << 8) | Data[6];
					Keys = (Keys << 8) | Data[5];
					Keys = (Keys << 8) | Data[4];
					ClientData = (AuthBinder)m_ClientHash[Keys];
					while (ClientData.Client.Crypto != null)
					{
						System.Threading.Thread.Sleep(10);
					}
					System.Threading.Monitor.Enter(ClientData);
					ClientData.Client.Sock = m_GameServer.GetSocket(sRemoteAddress, nRemotePort);
					ClientData.Client.Crypto = CryptoTemp;
					m_GameConnectedClients.Add(sRemoteAddress + ":" + nRemotePort, ClientData);
					m_ClientHash.Remove(Keys);
					ClientData.Client.Crypto.SetKeys(new byte[4]{Data[11], Data[10], Data[9], Data[8]}, new byte[4]{Data[7], Data[6], Data[5], Data[4]});
					ClientData.Client.Crypto.EnableAlternateKeys();
					try
					{
						System.Threading.Monitor.Exit(ClientData);
					}
					catch
					{ }
					Random PRNG = new Random();
					ClientData.Client.MessageID = (uint)(PRNG.Next(50000));
					ClientData.Client.GameServer = m_GameServer;
					lstClients.Items.Remove(ClientData.Client.Sock.RemoteEndPoint.ToString());
					lstClients.Items.Add(ClientData.Client);

					//Here we must differentiate between the different logon actions
					//
					if ((ClientData.Authenticated & 0x01) == 1 )//|| ClientData.Authenticated == 2) //Normal Login
					{
						ClientData.Client.Status = Mode.Staging;
						Reply = PacketBuilder.LanguageResponse(ClientData.Client.MessageID);
						ClientData.Client.Crypto.Encrypt(ref Reply);
						m_GameServer.SendRawData(sRemoteAddress, nRemotePort, Reply);

						//TODO: Restructure the CharacterInfo packet
						Reply = PacketBuilder.CharacterInfo();
						ClientData.Client.Crypto.Encrypt(ref Reply);
						ClientData.Client.Sock.Send(Reply);
						//m_GameServer.SendRawData(sRemoteAddress, nRemotePort, Reply);

						//TODO: Send the correct CharacterID
						Reply = PacketBuilder.AfterChar();
						ClientData.Client.Crypto.Encrypt(ref Reply);
						//m_GameServer.SendRawData(sRemoteAddress, nRemotePort, Reply);
						ClientData.Client.Sock.Send(Reply);
					}
					else if ((ClientData.Authenticated & 0x02) == 2) //Create new character
					{
						ClientData.Client.Status = Mode.CreateCharacter;
						Reply = PacketBuilder.CreateNewCharacter(ClientData.Client.MessageID);
						ClientData.Client.Crypto.Encrypt(ref Reply);
						ClientData.Client.Sock.Send(Reply);
					}
					else if (ClientData.Authenticated == 0x04) //Banned and should be dropped
					{
						//TODO: Disconnect a locked account
					}


				}
			}

		}

		private void btnListen_Click(object sender, System.EventArgs e)
		{
			if (m_ServersUp == false)
				StartServers();
			else
				StopServers();
		}

		private void StartServers()
		{
			m_AuthServer = new XYNetServer(((IPAddress)(cmbBindIP.SelectedItem)).ToString(), AUTHPORT, MINTHREADS, MAXTHREADS);
			m_GameServer = new XYNetServer(((IPAddress)(cmbBindIP.SelectedItem)).ToString(), GAMEPORT, MINTHREADS, MAXTHREADS);
			m_AuthServer.SetConnectionFilter(new ConnectionFilterDelegate(AuthConnectionFilter));
			m_AuthServer.SetExceptionHandler(new ExceptionHandlerDelegate(AuthExceptionHandler));
			m_AuthServer.SetBinaryInputHandler(new BinaryInputHandlerDelegate(AuthInputHandler));
			m_GameServer.SetConnectionFilter(new ConnectionFilterDelegate(GameConnectionFilter));
			m_GameServer.SetExceptionHandler(new ExceptionHandlerDelegate(GameExceptionHandler));
			m_GameServer.SetBinaryInputHandler(new BinaryInputHandlerDelegate(GameInputHandler));
			m_ServersUp = m_AuthServer.StartServer();
			m_ServersUp = m_ServersUp & m_GameServer.StartServer();
			if (m_ServersUp == true)
			{
				btnListen.Text = "Stop";
				cmbBindIP.Enabled = false;
				PingThread = new System.Threading.Thread(new System.Threading.ThreadStart(PingLoop));
				PingThread.Name = "PingThread";
				PingThread.Priority = System.Threading.ThreadPriority.BelowNormal;
				PingThread.Start();

			}
			else
				StopServers();

		}

		private void StopServers()
		{
			if (m_AuthServer != null)
				m_AuthServer.StopServer();
			if (m_GameServer != null)
				m_GameServer.StopServer();
			m_ClientHash.Clear();
			m_GameConnectedClients.Clear();
			m_AuthConnectedClients.Clear();
			lstClients.Items.Clear();
			m_ServersUp = false;
			btnListen.Text = "Listen";
			cmbBindIP.Enabled = true;
			if (PingThread != null)
                PingThread.Abort();
		}

		private void frmMain_Closed(object sender, System.EventArgs e)
		{
			StopServers();
		}

		private void btnDisconnectClient_Click(object sender, System.EventArgs e)
		{
			System.Threading.Thread DisThread = new System.Threading.Thread(new System.Threading.ThreadStart(DisconnectClient));
			DisThread.Start();
		}

		private void DisconnectClient()
		{
			if (lstClients.SelectedIndex != -1)
			{
				COClient Client;
				string[] Temp;
				Client = (COClient)lstClients.SelectedItem;
				Temp = Client.Sock.RemoteEndPoint.ToString().Split(':');
				//m_GameServer.DropClient(Temp[0], Convert.ToInt32(Temp[1]));
				m_GameServer.DropClient(Temp[0], Convert.ToInt32(Temp[1]));

			}
		}

		private void PingLoop()
		{
			COClient Client = null;
			while (true)
			{
				try
				{
					foreach (AuthBinder AB in m_GameConnectedClients.Values)
					{
						try
						{
							Client = AB.Client;
							if (Client.Char != null)
							{
								Client.SendData(PacketBuilder.Thef403(Client.Char.CharID));
								Client.Char.HP = Math.Min(Client.Char.MaxHP, Client.Char.HP + 1);
								Client.SendData(PacketBuilder.Vital(Client.Char.CharID, Vitals.HP, (uint)Client.Char.HP));
							}
						}
						catch (Exception ex) 
						{
							//	if (Client.Sock.Connected != true && m_GameConnectedClients.Count == 1)
							if (Client.Sock != null)
							{
								//Console.WriteLine(ex.ToString());
								GameExceptionHandler(ex, Client.Sock);
							}
						}
					}
					System.Threading.Thread.Sleep(5000);
				}
				catch (Exception) {}
				
			}
            
		}

		private void frmMain_Load(object sender, System.EventArgs e)
		{
		
		}

		private void btnRefresh_Click(object sender, System.EventArgs e)
		{
			object obj;
			for (int x = 0; x < lstClients.Items.Count; x++)
			{
				obj = lstClients.Items[0];
				lstClients.Items.Remove(obj);
				lstClients.Items.Add(obj);
			}
		}
	}
}

⌨️ 快捷键说明

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