GRPC-C++源碼分析(七)--bind&listen

對應於《GRPC-C++源碼分析(三)--main函數主要流程》中1.5節

<code>  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;
}
}/<code>


GRPC-C++源碼分析(七)--bind&listen


可以右鍵鼠標--在新標籤頁中打開圖片,會更清晰一些

  • 大家最關心的bind和listen操作在藍色框中
  • 本節的重點在server_start_listener方法上

下面大概說下上圖的流程:

  • 通過跟蹤,Server的AddListeningPort方法最終調用的是grpc_chttp2_server_add_port方法
  • 在grpc_chttp2_server_add_port方法中,grpc_tcp_server_create創建了grpc_tcp_server變量。
<code>//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的來源/<code>
  • grpc_tcp_server_add_port方法中創建了socket,並執行了bind和listen操作,將listen描述符封裝在了grpc_tcp_listener結構中,並最終賦給了grpc_tcp_server
  • grpc_server_add_listener方法將server_start_listener方法放在了grpc_server中,這塊會在後面用到

這塊的代碼沒有理解上的難點,基本上按照上圖所示就能跟下來


分享到:


相關文章: