1 #include "greeter.grpc.fb.h" 2 #include "greeter_generated.h" 3 4 #include <grpc++/grpc++.h> 5 6 #include <iostream> 7 #include <memory> 8 #include <string> 9 10 class GreeterServiceImpl final : public Greeter::Service { 11 virtual grpc::Status SayHello( 12 grpc::ServerContext *context, 13 const flatbuffers::grpc::Message<HelloRequest> *request_msg, 14 flatbuffers::grpc::Message<HelloReply> *response_msg) override { 15 // flatbuffers::grpc::MessageBuilder mb_; 16 // We call GetRoot to "parse" the message. Verification is already 17 // performed by default. See the notes below for more details. 18 const HelloRequest *request = request_msg->GetRoot(); 19 20 // Fields are retrieved as usual with FlatBuffers 21 const std::string &name = request->name()->str(); 22 23 // `flatbuffers::grpc::MessageBuilder` is a `FlatBufferBuilder` with a 24 // special allocator for efficient gRPC buffer transfer, but otherwise 25 // usage is the same as usual. 26 auto msg_offset = mb_.CreateString("Hello, " + name); 27 auto hello_offset = CreateHelloReply(mb_, msg_offset); 28 mb_.Finish(hello_offset); 29 30 // The `ReleaseMessage<T>()` function detaches the message from the 31 // builder, so we can transfer the resopnse to gRPC while simultaneously 32 // detaching that memory buffer from the builer. 33 *response_msg = mb_.ReleaseMessage<HelloReply>(); 34 assert(response_msg->Verify()); 35 36 // Return an OK status. 37 return grpc::Status::OK; 38 } 39 40 virtual grpc::Status SayManyHellos( 41 grpc::ServerContext *context, 42 const flatbuffers::grpc::Message<ManyHellosRequest> *request_msg, 43 grpc::ServerWriter<flatbuffers::grpc::Message<HelloReply>> *writer) 44 override { 45 // The streaming usage below is simply a combination of standard gRPC 46 // streaming with the FlatBuffers usage shown above. 47 const ManyHellosRequest *request = request_msg->GetRoot(); 48 const std::string &name = request->name()->str(); 49 int num_greetings = request->num_greetings(); 50 51 for (int i = 0; i < num_greetings; i++) { 52 auto msg_offset = mb_.CreateString("Many hellos, " + name); 53 auto hello_offset = CreateHelloReply(mb_, msg_offset); 54 mb_.Finish(hello_offset); 55 writer->Write(mb_.ReleaseMessage<HelloReply>()); 56 } 57 58 return grpc::Status::OK; 59 } 60 61 flatbuffers::grpc::MessageBuilder mb_; 62 }; 63 64 void RunServer() { 65 std::string server_address("0.0.0.0:50051"); 66 GreeterServiceImpl service; 67 68 grpc::ServerBuilder builder; 69 builder.AddListeningPort(server_address, grpc::InsecureServerCredentials()); 70 builder.RegisterService(&service); 71 std::unique_ptr<grpc::Server> server(builder.BuildAndStart()); 72 std::cerr << "Server listening on " << server_address << std::endl; 73 74 server->Wait(); 75 } 76 77 int main(int argc, const char *argv[]) { 78 RunServer(); 79 return 0; 80 } 81