public async Task EncodeMessage(ISendState sender, TransportMessage message) { var contentBytes = _transportSerializer.Serialize(message.Body, message.Headers); message.Headers[Headers.ContentLength] = contentBytes.Length.ToString(); message.Headers[Headers.MessageId] = message.Id.ToString("N"); var headerBuffer = new byte[65535]; headerBuffer[0] = (byte)TransportMessageType.Message; var offset = 1; var lastFeatureOffset = 0; foreach (var header in message.Headers) { lastFeatureOffset = offset; offset++; //ignore the feature flag for now. var length = Encoding.UTF8.GetBytes(header.Key, 0, header.Key.Length, headerBuffer, offset + 1); headerBuffer[offset] = (byte)length; offset += length + 1; length = Encoding.UTF8.GetBytes(header.Value, 0, header.Value.Length, headerBuffer, offset + 1); headerBuffer[offset] = (byte)length; offset += length + 1; } headerBuffer[lastFeatureOffset] = (byte)TransportHeaderFeatureFlags.EndOfHeaders; await sender.Send(headerBuffer, 0, offset); await sender.Send(contentBytes, 0, contentBytes.Length); }
public async Task EncodeHandshake(ISendState sender, int version) { var buffer = new byte[1]; buffer[0] = (byte)version; await sender.Send(buffer, 0, 1); }
public async Task EncodeNak(ISendState sender, Guid messageId) { var buffer = messageId.ToByteArray(); var messageBuffer = new byte[buffer.Length + 1]; buffer[0] = (byte)TransportMessageType.Nak; Buffer.BlockCopy(buffer, 0, messageBuffer, 1, buffer.Length); await sender.Send(messageBuffer, 0, messageBuffer.Length); }
public MessagingListenerClient(Socket socket, IMessageHandlerInvoker messageHandlerInvoker) { _socket = socket ?? throw new ArgumentNullException(nameof(socket)); _messageHandlerInvoker = messageHandlerInvoker; // For inbound data _readAwaitable = new SocketAwaitable(_readArgs); _readArgs.SetBuffer(_readBuffer, 0, _readBuffer.Length); _receiver = new SocketReceiver(socket, _readArgs, _readAwaitable, _readBuffer); _decoder = new SimpleProtocolDecoder(_serializer); // For outbound data _encoder = new SimpleProtocolEncoder(_serializer); _writeArgs = new SocketAsyncEventArgs(); _writeAwaitable = new SocketAwaitable(_writeArgs); _sendState = new SocketSender(_socket, _writeArgs, _writeAwaitable); }