private void LoginServerReceived(IAsyncResult ar) { try { int dataLength = loginSocket.EndReceive(ar); if (dataLength > 0) { byte[] tmp = new byte[dataLength]; Array.Copy(dataLoginServer, tmp, dataLength); NetworkMessage msg = new NetworkMessage(tmp); msg.PrepareToRead(xteaKey.ToUInt32Array()); msg.GetUInt16(); while (msg.Position < msg.Length) { byte cmd = msg.GetByte(); string message; switch (cmd) { case 0x0A: //Error message message = msg.GetString(); if (LoginServer_OnError != null) LoginServer_OnError(message); break; case 0x0B: //For your information message = msg.GetString(); if (LoginServer_FYI != null) LoginServer_FYI(message); break; case 0x14: //MOTD message = msg.GetString(); if (LoginServer_MOTD != null) LoginServer_MOTD(message); break; case 0x1E: //Patching exe/dat/spr messages case 0x1F: case 0x20: if (LoginServer_Patching != null) LoginServer_Patching("A new client is available."); return; case 0x28: //Select another login server if (LoginServer_SelectAnother != null) LoginServer_SelectAnother("Select another login server."); if (retry) { if (loginServerIndex < maxLoginServers - 1) { loginServerIndex++; TryLoginServer(); } else { if (LoginServer_CouldNotConnect != null) LoginServer_CouldNotConnect("Select another login server."); loginSocket.Disconnect(true); if (Socket_Disconnected != null) Socket_Disconnected("dataLength<=0"); } } break; case 0x64: //character list int nChars = (int)msg.GetByte(); charList = new CharacterLoginInfo[nChars]; for (int i = 0; i < nChars; i++) { charList[i].CharName = msg.GetString(); charList[i].WorldName = msg.GetString(); charList[i].WorldIP = msg.GetUInt32(); charList[i].WorldIPString = IPBytesToString(BitConverter.GetBytes(charList[i].WorldIP), 0); charList[i].WorldPort = msg.GetUInt16(); } if (LoginServer_CharList != null) LoginServer_CharList("Charlist received."); loginSocket.Disconnect(true); if (Socket_Disconnected != null) Socket_Disconnected("Charlist received."); return; default: //Notify about an unknown message if (LoginServer_UnknownMsg != null) LoginServer_UnknownMsg(msg.GetData().ToHexString()); loginSocket.Disconnect(true); if (Socket_Disconnected != null) Socket_Disconnected("Unknown Message."); break; } } } else //we didn't receive anything { if (LoginServer_ReceivedNothing != null) LoginServer_ReceivedNothing("Nothing received on LoginServerIndex=" + loginServerIndex); if (retry) { if (loginServerIndex < maxLoginServers - 1) { loginServerIndex++; TryLoginServer(); } else { if (LoginServer_CouldNotConnect != null) LoginServer_CouldNotConnect("dataLength<=0"); loginSocket.Disconnect(true); if (Socket_Disconnected != null) Socket_Disconnected("dataLength<=0"); } } } } catch (Exception) {} }
private void ParseFirstClientMsg() { try { clientRecvMsg.Position = clientRecvMsg.GetPacketHeaderSize(); OutgoingPacketType protocolId = (OutgoingPacketType)clientRecvMsg.GetByte(); int position; switch (protocolId) { case OutgoingPacketType.LoginServerRequest: protocol = Protocol.Login; clientRecvMsg.GetUInt16(); ushort clientVersion = clientRecvMsg.GetUInt16(); clientRecvMsg.GetUInt32(); clientRecvMsg.GetUInt32(); clientRecvMsg.GetUInt32(); position = clientRecvMsg.Position; clientRecvMsg.RsaOTDecrypt(); if (clientRecvMsg.GetByte() != 0) { Restart(); return; } xteaKey[0] = clientRecvMsg.GetUInt32(); xteaKey[1] = clientRecvMsg.GetUInt32(); xteaKey[2] = clientRecvMsg.GetUInt32(); xteaKey[3] = clientRecvMsg.GetUInt32(); clientRecvMsg.GetUInt32(); // account number clientRecvMsg.GetString(); // password clientRecvMsg.RsaOTEncrypt(position); clientRecvMsg.InsertPacketHeader(); serverTcp = new TcpClient(loginServers[selectedLoginServer].Server, loginServers[selectedLoginServer].Port); serverStream = serverTcp.GetStream(); serverStream.Write(clientRecvMsg.GetBuffer(), 0, clientRecvMsg.Length); serverStream.BeginRead(serverRecvMsg.GetBuffer(), 0, 2, new AsyncCallback(ServerReadCallBack), null); //clientStream.BeginRead(clientRecvMsg.GetBuffer(), 0, 2, new AsyncCallback(ClientReadCallBack), null); break; case OutgoingPacketType.GameServerRequest: protocol = Protocol.World; clientRecvMsg.GetUInt16(); clientRecvMsg.GetUInt16(); position = clientRecvMsg.Position; clientRecvMsg.RsaOTDecrypt(); if (clientRecvMsg.GetByte() != 0) { Restart(); return; } xteaKey[0] = clientRecvMsg.GetUInt32(); xteaKey[1] = clientRecvMsg.GetUInt32(); xteaKey[2] = clientRecvMsg.GetUInt32(); xteaKey[3] = clientRecvMsg.GetUInt32(); clientRecvMsg.GetByte(); // GM mode clientRecvMsg.GetUInt32(); // account number string characterName = clientRecvMsg.GetString(); clientRecvMsg.GetString(); // password clientRecvMsg.RsaOTEncrypt(position); clientRecvMsg.InsertPacketHeader(); int index = GetSelectedIndex(characterName); if (Version.CurrentVersion < 854) { serverTcp = new TcpClient(BitConverter.GetBytes(charList[index].WorldIP).ToIPString(), charList[index].WorldPort); serverStream = serverTcp.GetStream(); } serverStream.Write(clientRecvMsg.GetBuffer(), 0, clientRecvMsg.Length); serverStream.BeginRead(serverRecvMsg.GetBuffer(), 0, 2, new AsyncCallback(ServerReadCallBack), null); clientStream.BeginRead(clientRecvMsg.GetBuffer(), 0, 2, new AsyncCallback(ClientReadCallBack), null); break; default: break; } } catch (Exception ex) { WriteDebug(ex.ToString()); Restart(); } }