public void Run(CancellationToken token) { using (Socket socket = CreateSocket(_socketType)) { // Bind to address socket.Bind(_address); // Process while canellation not requested while (!token.IsCancellationRequested) { // Waits for messages var data = socket.Recv(); if (data == null) { continue; } Response response = null; using (var buffer = new BinaryMemoryStream(data)) { // by request type we can distinguish actual request var requestType = (RequestType)buffer.Reader.ReadInt16(); var handler = _handlerMapping(requestType, buffer); response = handler(buffer); } if (response != null) { using (var buffer = new BinaryMemoryStream()) { buffer.Writer.Write((short)response.ResponseType); response.WriteToStream(buffer); socket.Send(buffer.ToArray()); } } } } }
private Response Send(Request request, bool responseAvailable) { using (var memoryStream = new BinaryMemoryStream()) { memoryStream.Writer.Write((short)request.RequestType); request.WriteToStream(memoryStream); var data = memoryStream.ToArray(); _socket.Send(data); } if (!responseAvailable) { return(null); } var result = _socket.Recv(); using (var stream = new BinaryMemoryStream(result)) { var responseType = (ResponseType)stream.Reader.ReadInt16(); switch (responseType) { case ResponseType.BrokerInfoResponse: return(BrokerInfoResponse.ReadFromStream(stream)); case ResponseType.FetchResponse: return(FetchResponse.ReadFromStream(stream)); case ResponseType.MultiFetchResponse: return(MultiFetchResponse.ReadFromStream(stream)); } return(null); } }