首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实现在capnproto中等待服务器的客户端连接函数

实现在capnproto中等待服务器的客户端连接函数
EN

Stack Overflow用户
提问于 2018-04-22 07:57:53
回答 1查看 292关注 0票数 1

我试图在capnproto中实现,比如boost的connect函数,它阻止和重试服务器,或者basic_socket::async_connect,它允许我实现回调,然后再尝试连接一次。

例如,运行以下代码:

代码语言:javascript
复制
auto ioContext = kj::setupAsyncIo();
auto address = ioContext.provider->getNetwork()                                              
               .parseAddress("localhost:7500").wait(ioContext.waitScope);
auto connection = address->connect().wait(ioContext.waitScope);

如果服务器关机,显然会引发异常。

所以我的问题是:

  1. 是否有一种方法来注册将处理连接/连接失败的回调?
  2. 在capnproto中是否有内置机制已经允许自动重新连接?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-22 17:38:57

这里没有内置的任何内容,但是您可以很容易地实现它,如下所示:

代码语言:javascript
复制
kj::Promise<kj::AsyncIoStream> keepTryingConnect(kj::NetworkAddress& addr) {
  return addr.connect().catch_(
      [&addr](kj::Exception&& e) -> kj::Promise<kj::Own<kj::AsyncIoStream>> {
    if (e.getType() == kj::Exception::Type::DISCONNECTED) {
      // Try again.
      return keepTryingConnect(addr);
    } else {
      // Propagate error.
      return kj::mv(e);
    }
  });
}

请注意,DISCONNECTED异常类型对于任何类型的瞬态网络错误都是一种捕获,并且明确地用于这种目的。

至于断开时的重新连接:系统不能自动完成这一任务,因为Cap不知道重试飞行请求是否安全,也不知道如何重建连接上的任何功能。您需要做的是在应用程序中找到捕获DISCONNECTED异常类型,然后重试的位置,就像上面的代码一样。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49963780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档