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で終了させる。