#include "greeter.grpc.fb.h" #include "greeter_generated.h" #include #include #include #include class GreeterServiceImpl final : public Greeter::Service { virtual grpc::Status SayHello( grpc::ServerContext *context, const flatbuffers::grpc::Message *request_msg, flatbuffers::grpc::Message *response_msg) override { // flatbuffers::grpc::MessageBuilder mb_; // We call GetRoot to "parse" the message. Verification is already // performed by default. See the notes below for more details. const HelloRequest *request = request_msg->GetRoot(); // Fields are retrieved as usual with FlatBuffers const std::string &name = request->name()->str(); // `flatbuffers::grpc::MessageBuilder` is a `FlatBufferBuilder` with a // special allocator for efficient gRPC buffer transfer, but otherwise // usage is the same as usual. auto msg_offset = mb_.CreateString("Hello, " + name); auto hello_offset = CreateHelloReply(mb_, msg_offset); mb_.Finish(hello_offset); // The `ReleaseMessage()` function detaches the message from the // builder, so we can transfer the resopnse to gRPC while simultaneously // detaching that memory buffer from the builer. *response_msg = mb_.ReleaseMessage(); assert(response_msg->Verify()); // Return an OK status. return grpc::Status::OK; } virtual grpc::Status SayManyHellos( grpc::ServerContext *context, const flatbuffers::grpc::Message *request_msg, grpc::ServerWriter> *writer) override { // The streaming usage below is simply a combination of standard gRPC // streaming with the FlatBuffers usage shown above. const ManyHellosRequest *request = request_msg->GetRoot(); const std::string &name = request->name()->str(); int num_greetings = request->num_greetings(); for (int i = 0; i < num_greetings; i++) { auto msg_offset = mb_.CreateString("Many hellos, " + name); auto hello_offset = CreateHelloReply(mb_, msg_offset); mb_.Finish(hello_offset); writer->Write(mb_.ReleaseMessage()); } return grpc::Status::OK; } flatbuffers::grpc::MessageBuilder mb_; }; void RunServer() { std::string server_address("0.0.0.0:50051"); GreeterServiceImpl service; grpc::ServerBuilder builder; builder.AddListeningPort(server_address, grpc::InsecureServerCredentials()); builder.RegisterService(&service); std::unique_ptr server(builder.BuildAndStart()); std::cerr << "Server listening on " << server_address << std::endl; server->Wait(); } int main(int argc, const char *argv[]) { RunServer(); return 0; }