private void ServerReadCallBack(IAsyncResult ar) { byte[] serverData = null; try { int read = serverStream.EndRead(ar); if (read < 2) { Restart(); return; } lastInteraction = DateTime.Now; int pSize = (int)BitConverter.ToUInt16(serverRecvMsg.GetBuffer(), 0) + 2; while (read < pSize) { if (serverStream.CanRead) { read += serverStream.Read(serverRecvMsg.GetBuffer(), read, pSize - read); } else { throw new Exception("Connection broken."); } } serverRecvMsg.Length = pSize; switch (protocol) { case Protocol.Login: ParseCharacterList(); break; case Protocol.World: OnReceivedDataFromServer(serverRecvMsg.Data); serverData = serverRecvMsg.Data; if (serverRecvMsg.CheckAdler32() && serverRecvMsg.XteaDecrypt(xteaKey)) { serverRecvMsg.Position = serverRecvMsg.GetPacketHeaderSize(); int msgSize = (int)serverRecvMsg.GetUInt16() + serverRecvMsg.GetPacketHeaderSize() + 2; clientSendMsg.Reset(); while (serverRecvMsg.Position < msgSize) { int position = serverRecvMsg.Position; byte type = serverRecvMsg.PeekByte(); lastReceivedPacketTypes.Push(type); if (!ParsePacketFromServer(client, serverRecvMsg, clientSendMsg)) { byte[] unknown = serverRecvMsg.GetBytes(serverRecvMsg.Length - serverRecvMsg.Position); OnSplitPacketFromServer(unknown[0], unknown); WriteDebug("Unknown incoming packet, type: " + type.ToString("X") + ", data: " + unknown.ToHexString()); clientSendMsg.AddBytes(unknown); break; } byte[] data = new byte[serverRecvMsg.Position - position]; Array.Copy(serverRecvMsg.GetBuffer(), position, data, 0, data.Length); OnSplitPacketFromServer(data[0], data); } if (AllowIncomingModification && clientSendMsg.Length > clientSendMsg.GetPacketHeaderSize() + 2) { clientSendMsg.InsetLogicalPacketHeader(); clientSendMsg.PrepareToSend(xteaKey); SendToClient(clientSendMsg.Data); } else { SendToClient(serverData); } } else { SendToClient(serverData); } serverStream.BeginRead(serverRecvMsg.GetBuffer(), 0, 2, new AsyncCallback(ServerReadCallBack), null); break; case Protocol.None: SendToClient(serverRecvMsg.Data); break; } } catch (System.IO.IOException) { } catch (ObjectDisposedException) { } catch (Exception ex) { WriteDebug(ex.ToString()); if (serverData != null) { SendToClient(serverData); serverStream.BeginRead(serverRecvMsg.GetBuffer(), 0, 2, new AsyncCallback(ServerReadCallBack), null); } //Restart(); } }
private void ClientReadCallBack(IAsyncResult ar) { byte[] clientData = null; try { int read = clientStream.EndRead(ar); if (read < 2) { Restart(); return; } int pSize = (int)BitConverter.ToUInt16(clientRecvMsg.GetBuffer(), 0) + 2; while (read < pSize) { if (clientStream.CanRead) { read += clientStream.Read(clientRecvMsg.GetBuffer(), read, pSize - read); } else { throw new Exception("Connection broken."); } } clientRecvMsg.Length = pSize; switch (protocol) { case Protocol.None: ParseFirstClientMsg(); break; case Protocol.World: OnReceivedDataFromClient(clientRecvMsg.Data); clientData = clientRecvMsg.Data; if (clientRecvMsg.CheckAdler32() && clientRecvMsg.XteaDecrypt(xteaKey)) { clientRecvMsg.Position = clientRecvMsg.GetPacketHeaderSize(); int msgLength = (int)clientRecvMsg.GetUInt16() + 8; serverSendMsg.Reset(); int position = clientRecvMsg.Position; if (!ParsePacketFromClient(client, clientRecvMsg, serverSendMsg)) { //unknown packet byte[] unknown = clientRecvMsg.GetBytes(clientRecvMsg.Length - clientRecvMsg.Position); OnSplitPacketFromClient(unknown[0], unknown); WriteDebug("Unknown outgoing packet: " + unknown.ToHexString()); serverSendMsg.AddBytes(unknown); } byte[] data = new byte[clientRecvMsg.Position - position]; Array.Copy(clientRecvMsg.GetBuffer(), position, data, 0, data.Length); OnSplitPacketFromClient(data[0], data); if (AllowOutgoingModification && serverSendMsg.Length > serverSendMsg.GetPacketHeaderSize() + 2) { serverSendMsg.InsetLogicalPacketHeader(); serverSendMsg.PrepareToSend(xteaKey); SendToServer(serverSendMsg.Data); } else { SendToServer(clientData); } } else { SendToServer(clientData); } clientStream.BeginRead(clientRecvMsg.GetBuffer(), 0, 2, new AsyncCallback(ClientReadCallBack), null); break; case Protocol.Login: break; } } catch (ObjectDisposedException) { /*We don't have to log this exception. */ } catch (System.IO.IOException ex) { WriteDebug(ex.ToString()); } catch (Exception ex) { WriteDebug(ex.ToString()); if (clientData != null) { SendToServer(clientData); } } }