S-JIS[2024-11-24] 変更履歴

gRPC C++サーバー

C++版gRPCのサーバーのメモ。


protoファイル

proto/example.proto

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);
}

C++ソースファイル

src/ExampleService.cpp

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


gRPC C++へ戻る / gRPCへ戻る / 技術メモへ戻る
メールの送信先:ひしだま