C++版gRPCのサーバーのメモ。
syntax = "proto3"; package example.grpc; message Int64PairRequest { int64 first_value = 1; int64 second_value = 2; } message Int64PairResponse { int64 first_value = 1; int64 second_value = 2; } service ExampleService { rpc SendInt64Pair(Int64PairRequest) returns (Int64PairResponse); }
#include <iostream> #include <memory> #include <string> #include <grpcpp/grpcpp.h> #include "example.grpc.pb.h"
example.protoをビルドするとexample.grpc.pb.hというヘッダーファイルが作られるので、それをインクルードする。
using example::grpc::ExampleService; using example::grpc::Int64PairRequest; using example::grpc::Int64PairResponse;
using grpc::Server; using grpc::ServerBuilder; using grpc::ServerContext; using grpc::Status;
example.protoをビルドするとExampleService::Serviceというクラスが生成されるので、その関数の中身を実装する。
この例のSendInt64Pair関数は、Int64PairRequestを受け取ってInt64PairResponseを返す。
class ExampleServiceImpl final : public ExampleService::Service { Status SendInt64Pair(ServerContext *context, const Int64PairRequest *request, Int64PairResponse *response) override { int64_t first_value = request->first_value(); int64_t second_value = request->second_value(); std::cout << "server: " << first_value << ", " << second_value << std::endl; response->set_first_value(first_value); response->set_second_value(second_value); return Status::OK; } };
void RunServer(int port) { std::string server_address = "0.0.0.0:" + std::to_string(port); std::cout << "server address = " << server_address << std::endl; ExampleServiceImpl service; ServerBuilder builder; builder.AddListeningPort(server_address, grpc::InsecureServerCredentials()); builder.RegisterService(&service); std::unique_ptr<Server> server(builder.BuildAndStart()); server->Wait(); }
RunServer関数は、リクエストを受け付けるサーバーを稼働させるもの。
int main(int argc, char **argv) { int port = 50051; RunServer(port); return 0; }
cmakeとmakeを使ってビルドする。→C++版gRPCアプリケーションのビルド方法
./ExampleService
これで、リクエストを待ち受ける。
(→リクエストを送信するクライアントの例)
Ctrl+Cで終了させる。