2017-01-19 9 views
3

gRPCソースにhelloworldというプログラムの例があります。しかし、これに新しいので、私はサーバーに複数の非同期サービスを書く方法を理解していません。例hereは、SayHelloサービスコールを処理するクラスの新しいインスタンスを生成する方法について説明しています。cpp非同期サーバのgRPC複数サービス

  1. 新しいサービスを追加するには、たとえばSayByeをクライアントから呼び出すことができますか?
  2. クライアントがどのサービスコールを行ったかをサーバに識別させる方法を教えてください。

答えて

5

this threadと 関連 exampleを参照してください。 提案は、( この例でhello_CallDataboolパラメータを追加2つのCallDataオブジェクト、hello_ = true有するもの、及びhello_ = falseとのいずれかをインスタンス化し、それぞれの要求に 異なるRPCを有することです。

if (hello_) { 
    service_->RequestSayHello(...); 
} else { 
    service_->RequestSayBye(...); 
} 

呼び出し2種類以上の場合、あなたはenumの代わりboolと同じ動作 を達成することができました。

より柔軟なアプローチは、RPCごとに異なるCallDataのような クラスを持つことです。しかし、cq_->Next()からタグを取得した場合、 は、それがこれらのクラスのオブジェクトの1つのオブジェクトへのポインタであることを認識していますが、 はその正確な型を認識していません。これを克服するために、各サブクラスでは、必要に応じて、あなたがそれらを仮想Proceed()メンバ関数を持つクラスからのすべての 継承を持つことができ、 はそれを実装し、タグを取得するときに、CallDataとして それをキャストしProceed()を呼び出します。

class CallData { 
public: 
    virtual void Proceed() = 0; 
}; 

class HelloCallData final : public CallData {...}; 
class ByeCallData final : public CallData {...}; 

... 
new HelloCallData(...); 
new ByeCallData(...); 
cq_->Next(&tag, &ok); 
static_cast<CallData*>(tag)->Proceed(); 
... 
関連する問題