gpp在cpp异步服务器中的多个服务

dam*_*eak 7 grpc

我知道源代码中有一个示例helloworld程序gRPC.但是,对于这个新手,我不明白如何在服务器中编写多个异步服务.这里的示例讨论了生成类的新实例以处理SayHello服务调用.

  1. 例如SayBye,如何添加新服务,以便我可以从客户端调用它?
  2. 如何让服务器识别客户端进行的服务调用?

for*_*ong 10

请参阅此主题和相关 示例.建议是在(在此示例中)添加一个bool参数,实例化两个对象,一个用于,一个用,并且每个对象请求一个不同的RPC.CallDatahello_CallDatahello_ = truehello_ = false

if (hello_) {
  service_->RequestSayHello(...);
} else {
  service_->RequestSayBye(...);
}
Run Code Online (Sandbox Code Playgroud)

对于两种以上类型的调用,您可以使用enum而不是a 来实现相同的行为bool.

一种更灵活的方法是CallData为每个RPC 设置一个不同的类.但是,当您从中获取标记时cq_->Next(),您知道它是指向其中一个类的对象的指针,但您不知道它的确切类型.为了解决这个问题,你可以让它们都从具有虚拟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();
...
Run Code Online (Sandbox Code Playgroud)

  • @davidawad 你可以看看[这里](https://github.com/forkbong/crocks/blob/master/src/server/async_server.cc)。这是我在写答案时正在做的一个项目,它完成了我所描述的工作。我建议你从[这个提交](https://github.com/forkbong/crocks/commit/a74d92f055f4d3aa4646bb6709e7174b340523a5)开始,它引入了异步服务器,而且简单得多。如果您需要进一步的帮助,请随时询问,但从那时起我就没有写过任何 C++,我不确定我是否能够提供帮助。 (4认同)