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