コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }