basesocketconnectionhost.cs

来自「ActiveSync数据同步」· CS 代码 · 共 1,663 行 · 第 1/4 页

CS
1,663
字号
                //----- Decrypt!
                //rawBuffer = CryptUtils.DecryptData(connection, rawBuffer, FMessageBufferSize);

                //----- Fire Event!
                FireOnReceived(connection, rawBuffer, true);
                
            }

            readMessage = null;
            callbackData = null;
            
            if(!socketWasRead)
            {

                //----- Check Queue!
                lock (connection.SyncReadCount)
                {

                    connection.ReadCount--;

                    if (connection.ReadCount > 0)
                    {

                        //----- if it need more receiving, start the receive!
                        MessageBuffer continueReadMessage = new MessageBuffer(FSocketBufferSize);

                        //----- if the read queue has items, start to receive!
                        if (connection.Stream != null)
                        {
                            //----- Ssl!
                            connection.Stream.BeginRead(continueReadMessage.PacketBuffer, continueReadMessage.PacketOffSet, continueReadMessage.PacketRemaining, new AsyncCallback(BeginReadCallback), new CallbackData(connection, continueReadMessage));
                        }
                        else
                        {
                            //----- Socket!
                            connection.Socket.BeginReceive(continueReadMessage.PacketBuffer, continueReadMessage.PacketOffSet, continueReadMessage.PacketRemaining, SocketFlags.None, new AsyncCallback(BeginReadCallback), new CallbackData(connection, continueReadMessage));
                        }

                    }

                }

            }

        }

        #endregion

        #region ReadMessageWithPacketHeader

        private byte[] ReadMessageWithPacketHeader(byte[] connectionDelimiter, CallbackData callbackData, ref bool socketWasRead)
        {

            byte[] rawBuffer = null;

            BaseSocketConnection connection = callbackData.Connection;
            MessageBuffer readMessage = callbackData.Buffer;

            //----- Message with delimiter!
            int delimiterSize = connectionDelimiter.Length + 3;

            bool readPacket = false;
            bool readSocket = false;

            do
            {

                rawBuffer = null;

                if (readMessage.PacketOffSet > delimiterSize)
                {

                    //----- Has Delimiter!
                    for (int i = 0; i < connectionDelimiter.Length; i++)
                    {
                        if (connectionDelimiter[i] != readMessage.PacketBuffer[i])
                        {
                            //----- Bad Delimiter!
                            throw new BadDelimiterException("Message delimiter is different from Host delimiter.");
                        }

                    }

                    //----- Get Length!
                    int messageLength = (readMessage.PacketBuffer[connectionDelimiter.Length] << 16)
                                        + (readMessage.PacketBuffer[connectionDelimiter.Length + 1] << 8)
                                        + (readMessage.PacketBuffer[connectionDelimiter.Length + 2]);

                    if (messageLength > FMessageBufferSize)
                    {
                        throw new MessageLengthException("Message length is greater than Host maximum message length.");
                    }

                    //----- Check Length!
                    if (messageLength == readMessage.PacketOffSet)
                    {

                        //----- Equal -> Get rawBuffer!
                        rawBuffer = readMessage.GetRawBuffer(messageLength, delimiterSize);

                        //----- Decrypt!
                        rawBuffer = CryptUtils.DecryptData(connection, rawBuffer, FMessageBufferSize);

                        readPacket = false;
                        readSocket = false;

                    }
                    else
                    {

                        if (messageLength < readMessage.PacketOffSet)
                        {

                            //----- Less -> Get rawBuffer and fire event!
                            rawBuffer = readMessage.GetRawBuffer(messageLength, delimiterSize);

                            //----- Decrypt!
                            rawBuffer = CryptUtils.DecryptData(connection, rawBuffer, FMessageBufferSize);

                            readPacket = true;
                            readSocket = false;

                            FireOnReceived(connection, rawBuffer, false);

                        }
                        else
                        {

                            if (messageLength > readMessage.PacketOffSet)
                            {

                                //----- Greater -> Read Socket!
                                if (messageLength > readMessage.PacketLength)
                                {
                                    readMessage.Resize(messageLength);
                                }

                                readPacket = false;
                                readSocket = true;

                            }

                        }

                    }

                }
                else
                {

                    if (readMessage.PacketRemaining < delimiterSize)
                    {
                        //----- Adjust room for more! 
                        readMessage.Resize(readMessage.PacketLength + delimiterSize);
                    }

                    readPacket = false;
                    readSocket = true;

                }

            } while (readPacket);

            if (readSocket)
            {

              if (connection.Active)
              {

                //----- Read More!
                if (connection.Stream != null)
                {
                  //----- Ssl!
                  connection.Stream.BeginRead(readMessage.PacketBuffer, readMessage.PacketOffSet, readMessage.PacketRemaining, new AsyncCallback(BeginReadCallback), callbackData);
                }
                else
                {
                  //----- Socket!
                  connection.Socket.BeginReceive(readMessage.PacketBuffer, readMessage.PacketOffSet, readMessage.PacketRemaining, SocketFlags.None, new AsyncCallback(BeginReadCallback), callbackData);
                }

              }

            }

            socketWasRead = readSocket;
            return rawBuffer;

        }

        #endregion

        #region ReadMessageWithMessageTail

        private byte[] ReadMessageWithMessageTail(byte[] connectionDelimiter, CallbackData callbackData, ref bool socketWasRead)
        {

            string stringDelimiter = Encoding.GetEncoding(1252).GetString(connectionDelimiter);

            byte[] rawBuffer = null;

            BaseSocketConnection connection = callbackData.Connection;
            MessageBuffer readMessage = callbackData.Buffer;

            //----- Message with delimiter!
            int delimiterSize = connectionDelimiter.Length;

            bool readPacket = false;
            bool readSocket = false;

            do
            {

                rawBuffer = null;

                if (readMessage.PacketOffSet > delimiterSize)
                {

                    int index = Encoding.GetEncoding(1252).GetString(readMessage.PacketBuffer).IndexOf(stringDelimiter);

                    if (index >= 0)
                    {

                        rawBuffer = readMessage.GetRawBufferWithTail(connection, index, delimiterSize);

                        //----- Decrypt!
                        rawBuffer = CryptUtils.DecryptData(connection, rawBuffer, FMessageBufferSize);

                        if (readMessage.PacketOffSet == 0)
                        {
                            readPacket = false;
                            readSocket = false;
                        }
                        else
                        {

                            readPacket = true;
                            readSocket = false;

                            FireOnReceived(connection, rawBuffer, false);
                            
                        }

                    }
                    else
                    { 
                    
                        readPacket = false;
                        readSocket = true;
                        
                    }
                    
                }
                else
                {
                
                    readPacket = false;
                    readSocket = (readMessage.PacketOffSet > 0);

                }
                
                    
            } while (readPacket);

            //----- Adjust room for more! 
            readMessage.Resize(FMessageBufferSize);

            if (readSocket)
            {

                if (connection.Active)
                {

                    //----- Read More!
                    if (connection.Stream != null)
                    {
                        //----- Ssl!
                        connection.Stream.BeginRead(readMessage.PacketBuffer, readMessage.PacketOffSet, readMessage.PacketRemaining, new AsyncCallback(BeginReadCallback), callbackData);
                    }
                    else
                    {
                        //----- Socket!
                        connection.Socket.BeginReceive(readMessage.PacketBuffer, readMessage.PacketOffSet, readMessage.PacketRemaining, SocketFlags.None, new AsyncCallback(BeginReadCallback), callbackData);
                    }

                }

            }

            socketWasRead = readSocket;
            return rawBuffer;

        }

        #endregion

        #region BeginDisconnect

        /// <summary>
        /// Begin disconnect the connection
        /// </summary>
        internal void BeginDisconnect(BaseSocketConnection connection)
        {

            if (!Disposed)
            {

              ConnectionEventArgs e = new ConnectionEventArgs(connection);

              if (connection.Active)
              {

                try
                {

                  if ((Environment.OSVersion.Version.Major == 5)
                      && (Environment.OSVersion.Version.Minor >= 1))
                  {

                    //----- NT5 / WinXP and later!
                    connection.Socket.BeginDisconnect(false, new AsyncCallback(BeginDisconnectCallback), e);

                  }
                  else
                  {

                    //----- NT5 / Win2000!
                    ThreadPool.QueueUserWorkItem(new WaitCallback(BeginDisconnectCallbackProcessing), e);
                    
                  }

                }
                catch (Exception ex)
                {
                  FireOnException(connection, ex);
                }

              }
              else
              {

                RemoveSocketConnection(connection);
                DisposeAndNullConnection(ref connection);

              }

            }

        }

        #endregion

        #region BeginDisconnectCallback

        /// <summary>
        /// Disconnect callback.
        /// </summary>
        private void BeginDisconnectCallback(IAsyncResult ar)
        {

            if (!Disposed)
            {
                ThreadPool.QueueUserWorkItem(new WaitCallback(BeginDisconnectCallbackProcessing), ar);
            }

        }

        #endregion

        #region BeginDisconnectCallbackProcessing

        private void BeginDisconnectCallbackProcessing(object state)
        {

            if (!Disposed)
            {

                bool calledByBeginDisconnect = false;
                
                IAsyncResult ar = null;
                BaseSocketConnection connection = null;
                ConnectionEventArgs e = null;

                try
                {

                    if (state is ConnectionEventArgs)
                    {

                        //----- NT5 / Win2000!
                        e = (ConnectionEventArgs)state;
                        calledByBeginDisconnect = false;

                    }
                    else
                    {

                        //----- NT5 / WinXP and later!
                        ar = (IAsyncResult)state;
                        e = (ConnectionEventArgs)ar.AsyncState;
                        calledByBeginDisconnect = true;

                    }

                    connection = (BaseSocketConnection)e.Connection;

                    if (connection.Active)
                    {

                        if (calledByBeginDisconnect)
                        {
                            connection.Socket.EndDisconnect(ar);
                        }

                        lock (connection.SyncActive)
                        {

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?