前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >GRPC-C++源码分析(十一)--bind&listen

GRPC-C++源码分析(十一)--bind&listen

原创
作者头像
路小饭
修改2019-04-24 11:12:39
1.3K0
修改2019-04-24 11:12:39
举报

对应于《GRPC-C++源码分析(三)--main线程》中1.5节

代码语言:javascript
复制
  for (auto port = ports_.begin(); port != ports_.end(); port++) {
    int r = server->AddListeningPort(port->addr, port->creds.get());
    if (!r) {
      if (added_port) server->Shutdown();
      return nullptr;
    }
    added_port = true;
    if (port->selected_port != nullptr) {
      *port->selected_port = r;
    }
  }

可以右键鼠标--在新标签页中打开图片,会更清晰一些

  • 大家最关心的bind和listen操作在蓝色框中
  • 本节的重点在server_start_listener方法上

下面大概说下上图的流程:

  • 通过跟踪,Server的AddListeningPort方法最终调用的是grpc_chttp2_server_add_port方法
  • 在grpc_chttp2_server_add_port方法中,grpc_tcp_server_create创建了grpc_tcp_server变量。
代码语言:javascript
复制
//tcp_server.cc
grpc_error* grpc_tcp_server_create(grpc_closure* shutdown_complete,
                                   const grpc_channel_args* args,
                                   grpc_tcp_server** server) {
  return grpc_tcp_server_impl->create(shutdown_complete, args, server);
}
//又遇到了熟悉grpc_tcp_server_impl类型,如果还不熟悉的同学,可以参考图中上方区域,说明了grpc_tcp_server_impl的来源
  • grpc_tcp_server_add_port方法中创建了socket,并执行了bind和listen操作,将listen描述符封装在了grpc_tcp_listener结构中,并最终赋给了grpc_tcp_server
  • grpc_server_add_listener方法将server_start_listener方法放在了grpc_server中,这块会在后面用到

这块的代码没有理解上的难点,基本上按照上图所示就能跟下来

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档