public void Trace( NetState state ) { try { using ( StreamWriter sw = new StreamWriter( "Packets.log", true ) ) { byte[] buffer = m_Data; if ( buffer.Length > 0 ) sw.WriteLine( "Client: {0}: Unhandled packet 0x{1:X2}", state, buffer[0] ); using ( MemoryStream ms = new MemoryStream( buffer ) ) Utility.FormatBuffer( sw, ms, buffer.Length ); sw.WriteLine(); sw.WriteLine(); } } catch { } }
public bool HandleReceive(NetState ns) { ByteQueue buffer = ns.Buffer; if (buffer == null || buffer.Length <= 0) return true; lock (buffer) { int length = buffer.Length; if (!ns.Seeded) { if (buffer.GetPacketID() == 0xEF) { // new packet in client 6.0.5.0 replaces the traditional seed method with a seed packet // 0xEF = 239 = multicast IP, so this should never appear in a normal seed. So this is backwards compatible with older clients. ns.Seeded = true; } else if (buffer.Length >= 4) { buffer.Dequeue(m_Peek, 0, 4); int seed = (m_Peek[0] << 24) | (m_Peek[1] << 16) | (m_Peek[2] << 8) | m_Peek[3]; if (seed == 0) { Console.WriteLine("Login: {0}: Invalid client detected, disconnecting", ns); ns.Dispose(); return false; } ns.m_Seed = seed; ns.Seeded = true; length = buffer.Length; } else { return true; } } while (length > 0 && ns.Running) { int packetID = buffer.GetPacketID(); if (!ns.SentFirstPacket && packetID != 0xF0 && packetID != 0xF1 && packetID != 0xCF && packetID != 0x80 && packetID != 0x91 && packetID != 0xA4 && packetID != 0xEF) { Console.WriteLine("Client: {0}: Encrypted client detected, disconnecting", ns); ns.Dispose(); break; } PacketHandler handler = ns.GetHandler(packetID); if (handler == null) { byte[] data = new byte[length]; length = buffer.Dequeue(data, 0, length); new PacketReader(data, length, false).Trace(ns); break; } int packetLength = handler.Length; if (packetLength <= 0) { if (length >= 3) { packetLength = buffer.GetPacketLength(); if (packetLength < 3) { ns.Dispose(); break; } } else { break; } } if (length >= packetLength) { byte[] packetBuffer; if (BufferSize >= packetLength) packetBuffer = m_Buffers.AcquireBuffer(); else packetBuffer = new byte[packetLength]; packetLength = buffer.Dequeue(packetBuffer, 0, packetLength); PacketReader r = new PacketReader(packetBuffer, packetLength, handler.Length != 0); handler.OnReceive(ns, r); length = buffer.Length; if (BufferSize >= packetLength) m_Buffers.ReleaseBuffer(packetBuffer); } else { break; } } } return true; }
private void CheckListener() { for (int j = 0; j < m_Listeners.Length; ++j) { Socket[] accepted = m_Listeners[j].Slice(); for (int i = 0; i < accepted.Length; ++i) { NetState ns = new NetState(accepted[i], this); ns.Start(); if (ns.Running) Console.WriteLine("Client: {0}: Connected. [{1} Online]", ns, NetState.Instances.Count); } } }
public void OnReceive(NetState ns) { lock (this) m_Queue.Enqueue(ns); Program.Set(); }