public void Dispose() { if (!m_disposed) { lock (m_locker) { if (!m_disposed) { m_disposed = true; try { m_socket.Shutdown(SocketShutdown.Both); } catch (SocketException) { } m_socket.Close(); if (m_recvCipher != null) { m_recvCipher.Dispose(); } m_offset = 0; m_buffer = null; m_sendCipher = null; m_recvCipher = null; OnDisconnected(); } } } }
private void HandleStream() { if (m_header) { int size = MartialCipher.GetPacketLength(m_buffer); if (size > m_socket.ReceiveBufferSize) { Close(); return; } WaitForData(false, size - 4); } else { byte[] mh_buffer = new byte[4]; Buffer.BlockCopy(m_buffer, 0, mh_buffer, 0, 4); for (int i = 0; i < m_buffer.Length - 4; i++) { m_buffer[i] = m_buffer[i + 4]; } Array.Resize(ref m_buffer, m_buffer.Length - 4); m_recvCipher.Transform(m_buffer); OnPacket(mh_buffer.Concat(m_buffer).ToArray()); WaitForData(true, 4); } }
public MartialSession(Socket socket) { m_socket = socket; m_socket.NoDelay = false; m_socket.ReceiveBufferSize = 0xFFFF; m_socket.SendBufferSize = 0xFFFF; m_locker = new object(); m_disposed = false; Label = ((IPEndPoint)(m_socket.RemoteEndPoint)).Address.ToString(); m_sendCipher = new MartialCipher(MartialCipher.TransformDirection.Encrypt); m_recvCipher = new MartialCipher(MartialCipher.TransformDirection.Decrypt); WaitForData(true, 4); // cause of Martial Packet Header size }