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); }
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); }