private async Task<byte[]> ReadFromInputStreamAsync(StreamSocket socket, CancellationToken token) { var header = new MqttFixedHeader(); uint bytesRead; using (var reader = new DataReader(socket.InputStream)) { reader.InputStreamOptions = InputStreamOptions.Partial; // Read the fixed header var headerByte = new byte[1]; do { bytesRead = await reader.LoadAsync(1); if (bytesRead > 0) { reader.ReadBytes(headerByte); } } while (bytesRead > 0 && header.AppendByte(headerByte[0])); reader.DetachStream(); if (token.IsCancellationRequested) { // Operation was cancelled return null; } if (!header.IsComplete) { _logger.LogMessage("Socket", LogLevel.Verbose, "Read header operation could not read header, aborting."); return null; } _logger.LogMessage("Socket", LogLevel.Verbose, string.Format("Received message header type '{0}' from server.", header.MessageType)); } var msgBuffer = header.CreateMessageBuffer(); //_logger.LogMessage("Socket", LogLevel.Verbose, // string.Format("Received message header=0x{0:X}, Remaining length={1}.", header.Buffer[0], header.RemainingLength)); using (var reader = new DataReader(socket.InputStream)) { if (header.RemainingLength > 0) { // Create a buffer and read the remaining message bytesRead = await reader.LoadAsync((uint)header.RemainingLength); //_logger.LogMessage("Socket", LogLevel.Verbose, // string.Format(" Bytes read= {0}.", bytesRead)); if (bytesRead > 0) { var remainingBuffer = new byte[reader.UnconsumedBufferLength]; reader.ReadBytes(remainingBuffer); // Merge the fixed header and remaining buffers together Array.ConstrainedCopy(remainingBuffer, 0, msgBuffer, header.HeaderSize, remainingBuffer.Length); } } reader.DetachStream(); if (token.IsCancellationRequested) { // Operation was cancelled return null; } return msgBuffer; } }
private byte[] Read() { var header = new MqttFixedHeader(); var headerByte = new byte[1]; int receivedSize; INetworkStream stream = GetStream(); // Read the fixed header do { receivedSize = stream.Receive(headerByte, 0, 1); } while (receivedSize > 0 && header.AppendByte(headerByte[0])); if (!header.IsComplete) { _logger.LogMessage("Socket", LogLevel.Error, "Header data invalid for incoming message."); throw new IOException("Unable to receive the MQTT fixed header."); } _logger.LogMessage("Socket", LogLevel.Verbose, "Begin reading payload for incoming message type: " + header.MessageType); // Create a buffer and read the remaining message var completeBuffer = header.CreateMessageBuffer(); receivedSize = 0; while (receivedSize < header.RemainingLength) { receivedSize += stream.Receive(completeBuffer, header.HeaderSize + receivedSize, header.RemainingLength - receivedSize); } return completeBuffer; }
private byte[] ReadFromInputStreamAsync(Stream stream, string clientUid, CancellationToken token) { var header = new MqttFixedHeader(); var headerByte = new byte[1]; int receivedSize; // Read the fixed header do { receivedSize = stream.Read(headerByte, 0, headerByte.Length); } while (receivedSize > 0 && header.AppendByte(headerByte[0])); if (!header.IsComplete) { _logger.LogMessage("Socket", LogLevel.Error, string.Format("Read header operation could not read header, aborting.")); return null; } _logger.LogMessage("Socket", LogLevel.Verbose, string.Format("Received message header type '{0}' from client {1}.", header.MessageType, clientUid)); //_logger.LogMessage("Socket", LogLevel.Warning, // string.Format("Received message header=0x{0:X}, Remaining length={1}.", header.Buffer[0], header.RemainingLength)); // Create a buffer and read the remaining message var completeBuffer = header.CreateMessageBuffer(); receivedSize = 0; while (receivedSize < header.RemainingLength) { receivedSize += stream.Read(completeBuffer, header.HeaderSize + receivedSize, header.RemainingLength - receivedSize); } //_logger.LogMessage("Socket", LogLevel.Warning, // string.Format(" Bytes read= {0}.", receivedSize)); if (token.IsCancellationRequested) { // Operation was cancelled _logger.LogMessage("Socket", LogLevel.Verbose, string.Format("Read header operation cancelled.")); return null; } return completeBuffer; }