public virtual void Dispose(bool flush) { if (mDisposing) { return; } ServerConsole.StatusLine("{0}: Disconnected.", this); mDisposing = true; //##PACKET## Logout Thread.Sleep(100); if (flush) { flush = Flush(); } // Check for existing objects in the World // FIXME - Account cant be removed // We need to check using World.GetAccount() after a new connection // from login -> char or char -> world // ... //if (Account != null) { // World.RemoveObject(Account); //} if (mSocket != null) { try { mSocket.Shutdown(SocketShutdown.Both); } catch (SocketException ex) { ExceptionHandler.Trace(ex); } try { mSocket.Close(); SocketPool.ReleaseSocket(mSocket); } catch (SocketException ex) { ExceptionHandler.Trace(ex); } mSocket = null; } mBuffer = null; mRecvBuffer = null; mOnReceive = null; mOnSend = null; mRunning = false; mDisposed.Enqueue(this); if (!mSendQueue.IsEmpty) { lock (mSendQueue) { mSendQueue.Clear(); } } }
public bool HandleReceive(NetState ns) { if (ns == null || ns.Running == false) { return(false); } ByteQueue buffer = ns.Buffer; if (buffer == null || buffer.Length <= 0) { return(true); } ServerConsole.DebugLine("{0}: Incoming data, {1} bytes", ns, buffer.Length); /* * Packet Analyse/verify && Parsing */ lock (buffer) { int turns = 0; int length = buffer.Length; while (length > 0 && ns != null && ns.Running) { short packetID = buffer.GetPacketID(); #if DEBUG_PACKETS // debug log using (TextWriter writer = File.CreateText(AppDomain.CurrentDomain.BaseDirectory + @"\packet_" + DateTime.Now.UnixTimestamp() + ".log")) { using (MemoryStream ms = new MemoryStream(buffer.ByteBuffer)) Tools.FormatBuffer(writer, ms, (int)ms.Length); } #endif PacketHandler handler = PacketHandlers.GetHandler(packetID); if (handler == null) { byte[] data = new byte[length]; length = buffer.Dequeue(data, 0, length); // Log unknown packets string unknownPacketPath = AppDomain.CurrentDomain.BaseDirectory + @"\packet_" + packetID.ToString("X4") + ".log"; if (File.Exists(unknownPacketPath) == false) { using (TextWriter writer = File.CreateText(unknownPacketPath)) { writer.WriteLine("Unknown packet 0x" + packetID.ToString("X4") + ", length " + length); using (MemoryStream ms = new MemoryStream(data)) { Tools.FormatBuffer(writer, ms, (int)ms.Length); } } } ServerConsole.WarningLine("{0}: P {1:X4}, {2} bytes, no Handler found!", ns, packetID, length); break; } ServerConsole.StatusLine("{0}: [{1}] P {2:X4}, {3} bytes, handled {4}", ns, handler.Name, packetID, length, handler.Length); byte[] packetBuffer; // If we set the length to -1 (dynamic packet length), read the full buffer int bufferLength = (handler.Length > 0 ? handler.Length : length); if (bufferLength < mBufferSize) { packetBuffer = mBuffers.AcquireBuffer(); } else { packetBuffer = new byte[bufferLength]; } buffer.Dequeue(packetBuffer, 0, bufferLength); PacketReader r = new PacketReader(packetBuffer, bufferLength, 0, true); handler.OnReceive(ns, r); length -= bufferLength; if (bufferLength < mBufferSize) { mBuffers.ReleaseBuffer(packetBuffer); } else { packetBuffer = null; } turns++; } // end while()*/ } // end Lock() // Clear internal byte buffer for receive data if (ns != null && ns.Buffer != null) { ns.Buffer.Clear(); } return(true); }