📄 frmmain.cs
字号:
}
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 + -