Exemple #1
0
        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();
                    }
                }
            }
        }
Exemple #2
0
        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);
            }
        }
Exemple #3
0
        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
        }