/// <summary> /// Waits for more data to arrive /// </summary> /// <param name="manager"> Info about data to be received </param> private void WaitForData(ReceiveManager manager) { try { Socket.BeginReceive(manager.Buffer, manager.Index, manager.Buffer.Length - manager.Index, SocketFlags.None, DataReceived, manager); } catch (Exception e) { Console.WriteLine(e.Message); Console.WriteLine(e.StackTrace); } }
/// <summary> /// Waits for more data to arrive /// </summary> /// <param name="manager"> Info about data to be received </param> private void WaitForData(ReceiveManager manager) { try { Socket.BeginReceive(manager.Buffer, manager.Index, manager.Buffer.Length - manager.Index, SocketFlags.None, DataReceived, manager); } catch (Exception e) { Console.WriteLine(e.Message); Console.WriteLine(e.StackTrace); } }
/// <summary> /// Data received event handler /// </summary> /// <param name="iar"> IAsyncResult of the data received event </param> private void DataReceived(IAsyncResult iar) { ReceiveManager manager = (ReceiveManager)iar.AsyncState; try { int received = Socket.EndReceive(iar); manager.Index += received; if (manager.Index == manager.Buffer.Length) { byte[] data = manager.Buffer; switch (manager.State) { case ReceiveState.Header: int packetLength = MapleCrypto.GetPacketLength(data); manager.State = ReceiveState.Content; manager.Buffer = new byte[packetLength]; manager.Index = 0; WaitForData(manager); break; case ReceiveState.Content: ReceiveCrypto.Crypt(data); MapleCustomEncryption.Decrypt(data); PacketReceived(new MaplePacketReader(data)); WaitForData(new ReceiveManager()); break; } } else { Console.WriteLine("[Warning] Not enough data"); } } catch (Exception e) { Console.WriteLine(e.Message); Console.WriteLine(e.StackTrace); Close("Exception while receiving data."); } }