void HandlePacket(CodedInputStream reader) { var service_id = reader.ReadRawByte(); var method_id = reader.ReadInt32() - 1; var request_id = reader.ReadFixedUInt16(); Debug.WriteLine("Received packet [service_id: 0x{0:X2}, method_id: {1}, request_id: {2}]", service_id, method_id, request_id); // Handle RPC responses if (service_id == RESPONSE_SERVICE_ID) { Debug.WriteLine(" received response"); HandleResponse(request_id, reader); } else { var listener_id = reader.ReadInt64(); Debug.WriteLine(" listener_id: {0}", listener_id); IService service; if (!exportedServices.TryGetValue(service_id, out service)) { throw new ArgumentException("No service bound on index " + service_id); } // Load correct descriptor for the requested method var method_descriptor = service.DescriptorForType.Methods[method_id]; // Create a prototype of the request message var message_prototype = service.GetRequestPrototype(method_descriptor); // And create a builder for that message var builder = message_prototype.WeakCreateBuilderForType(); // Read the message into the correct builder var message = ReadMessage(reader, builder); Debug.WriteLine(" passing RPC to {0}::{1}", method_descriptor.Service.Name, method_descriptor.Name); Debug.WriteLine(message.ToString()); // Response callback sends the repsponse service.CallMethod(method_descriptor, null, message, m => SendResponse(request_id, m)); } }