(原创)C/C语言, 平台是debian10, grpc版本:grpc-c/1.25.0-dev grpc-c/8.0.0, 使用的例子是自带的例子GreeterClient

grpc Unary模式下客户端从开始连接到发送数据的主要流程

graph TD;
001(grpc_connector_connect #connector.cc:36 准备开始连接)-->002(chttp2_connector_connect #chttp2_connector.cc:225)

002(chttp2_connector_connect #chttp2_connector.cc:225)-->003(tcp_connect #tcp_client_posix.cc:350)

003(tcp_connect #tcp_client_posix.cc:350)-->004(grpc_tcp_client_create_from_prepared_fd #tcp_client_posix.cc:294 调用connect连接服务器)

004(grpc_tcp_client_create_from_prepared_fd #tcp_client_posix.cc:294 调用connect连接服务器)-->005(grpc_tcp_client_create_from_prepared_fd #tcp_client_posix.cc:332)

005(grpc_tcp_client_create_from_prepared_fd #tcp_client_posix.cc:332)-->006(grpc_core::LockfreeEvent::NotifyOn #lockfree_event.cc:110 设置grpc_core::LockfreeEvent write_closure的变量state_为回调为on_writable的closure)

006(grpc_core::LockfreeEvent::NotifyOn #lockfree_event.cc:110 设置grpc_core::LockfreeEvent write_closure的变量state_为回调为on_writable的closure)-->007(pollable_process_events #ev_epollex_linux.cc:903 连接上后有可写事件)

007(pollable_process_events #ev_epollex_linux.cc:903 连接上后有可写事件)-->008(grpc_core::LockfreeEvent::SetReady #lockfree_event.cc:243 调为on_writable函数)

008(grpc_core::LockfreeEvent::SetReady #lockfree_event.cc:243 调为on_writable函数)-->009(on_writable #tcp_client_posix.cc:244 在on_writable函数准备调用connected函数)

009(on_writable #tcp_client_posix.cc:244 在on_writable函数准备调用connected函数)-->010(connected #chttp2_connector.cc:193 在connected函数准备开始http2握手)

010(connected #chttp2_connector.cc:193 在connected函数准备开始http2握手)-->011(DoHandshake #handshaker.cc:249 开始执行握手)

011(DoHandshake #handshaker.cc:249 开始执行握手)-->012(CallNextHandshakerLocked #handshaker.cc:182 开始执行CallNextHandshakerLocked)

012(CallNextHandshakerLocked #handshaker.cc:182 开始执行CallNextHandshakerLocked)-->013(HttpConnectHandshaker::DoHandshake #http_connect_handshaker.cc:263 调用on_handshake_done)

013(HttpConnectHandshaker::DoHandshake #http_connect_handshaker.cc:263 调用on_handshake_done)-->014(on_handshake_done #chttp2_connector.cc:119 握手完了开始http2写)

014(on_handshake_done #chttp2_connector.cc:119 握手完了开始http2写)-->015(grpc_create_chttp2_transport #chttp2_transport.cc:3195 创建chttp2_transport)

015(grpc_create_chttp2_transport #chttp2_transport.cc:3195 创建chttp2_transport)-->016(grpc_chttp2_transport #chttp2_transport.cc:538 chttp2_transport的构造函数)

016(grpc_chttp2_transport #chttp2_transport.cc:538 chttp2_transport的构造函数)-->017(grpc_chttp2_act_on_flowctl_action #chttp2_transport.cc:2439 流量控制)

017(grpc_chttp2_act_on_flowctl_action #chttp2_transport.cc:2439 流量控制)-->018(WithUrgency #chttp2_transport.cc:2425 流量控制中对chttp2_transport的动作)

018(WithUrgency #chttp2_transport.cc:2425 流量控制中对chttp2_transport的动作)-->019(grpc_chttp2_initiate_write #chttp2_transport.cc:932 chttp2_transport写的初始化并调用真正的write_action_begin_locked写操作)

019(grpc_chttp2_initiate_write #chttp2_transport.cc:932 chttp2_transport写的初始化并调用真正的write_action_begin_locked写操作)-->020(write_action_begin_locked #chttp2_transport.cc:981 开始写)

020(write_action_begin_locked #chttp2_transport.cc:981 开始写)-->021(write_action #chttp2_transport.cc:1007 准备参数调用grpc_endpoint_write)

021(write_action #chttp2_transport.cc:1007 准备参数调用grpc_endpoint_write)-->022(grpc_endpoint_write #endpoint.cc:33 调用grpc_endpoint中的函数指针write指向tcp_write)

022(grpc_endpoint_write #endpoint.cc:33 调用grpc_endpoint中的函数指针write指向tcp_write)-->023(tcp_write #tcp_posix.cc:1093 调用tcp_flush #tcp_posix.cc:972 tcp_flush调用tcp_send #tcp_posix.cc:660并最终调用sendmsg, 发送的数据结构是struct msghdr)

grpc Unary模式下客户端从开始连接到接收数据的主要流程

graph TD;
001(grpc_connector_connect #connector.cc:36 准备开始连接)-->002(chttp2_connector_connect #chttp2_connector.cc:225)

002(chttp2_connector_connect #chttp2_connector.cc:225)-->003(tcp_connect #tcp_client_posix.cc:350)

003(tcp_connect #tcp_client_posix.cc:350)-->004(grpc_tcp_client_create_from_prepared_fd #tcp_client_posix.cc:294 调用connect连接服务器)

004(grpc_tcp_client_create_from_prepared_fd #tcp_client_posix.cc:294 调用connect连接服务器)-->005(grpc_tcp_client_create_from_prepared_fd #tcp_client_posix.cc:332)

005(grpc_tcp_client_create_from_prepared_fd #tcp_client_posix.cc:332)-->006(grpc_core::LockfreeEvent::NotifyOn #lockfree_event.cc:110 设置grpc_core::LockfreeEvent write_closure的变量state_为回调为on_writable的closure)

006(grpc_core::LockfreeEvent::NotifyOn #lockfree_event.cc:110 设置grpc_core::LockfreeEvent write_closure的变量state_为回调为on_writable的closure)-->007(pollable_process_events #ev_epollex_linux.cc:903 连接上后有可写事件)

007(pollable_process_events #ev_epollex_linux.cc:903 连接上后有可写事件)-->008(grpc_core::LockfreeEvent::SetReady #lockfree_event.cc:243 调为on_writable函数)

008(grpc_core::LockfreeEvent::SetReady #lockfree_event.cc:243 调为on_writable函数)-->009(on_writable #tcp_client_posix.cc:244 在on_writable函数准备调用connected函数)

009(on_writable #tcp_client_posix.cc:244 在on_writable函数准备调用connected函数)-->010(connected #chttp2_connector.cc:193 在connected函数准备开始http2握手)

010(connected #chttp2_connector.cc:193 在connected函数准备开始http2握手)-->011(DoHandshake #handshaker.cc:249 开始执行握手)

011(DoHandshake #handshaker.cc:249 开始执行握手)-->012(CallNextHandshakerLocked #handshaker.cc:182 开始执行CallNextHandshakerLocked)

012(CallNextHandshakerLocked #handshaker.cc:182 开始执行CallNextHandshakerLocked)-->013(HttpConnectHandshaker::DoHandshake #http_connect_handshaker.cc:263 调用on_handshake_done)

013(HttpConnectHandshaker::DoHandshake #http_connect_handshaker.cc:263 调用on_handshake_done)-->014(on_handshake_done #chttp2_connector.cc:147 握手完了开始http2读)

014(on_handshake_done #chttp2_connector.cc:147 握手完了开始http2读)-->015(grpc_chttp2_transport_start_reading #chttp2_transport.cc:3212 通过GRPC_CLOSURE_SCHED调用read_action_locked)

015(grpc_chttp2_transport_start_reading #chttp2_transport.cc:3212 通过GRPC_CLOSURE_SCHED调用read_action_locked)-->016(read_action_locked #chttp2_transport.cc:2568 调用continue_read_action_locked)

016(read_action_locked #chttp2_transport.cc:2568 调用continue_read_action_locked)-->017(continue_read_action_locked #chttp2_transport.cc:2579 调用grpc_endpoint_read)

017(continue_read_action_locked #chttp2_transport.cc:2579 调用grpc_endpoint_read)-->018(grpc_endpoint_read #endpoint.cc:28 调用grpc_endpoint中的read指针函数tcp_read)

018(grpc_endpoint_read #endpoint.cc:28 调用grpc_endpoint中的read指针函数tcp_read)-->019(tcp_read #tcp_posix.cc:636 调用notify_on_read把read_closure的变量state_设置为tcp->read_done_closure)

019(tcp_read #tcp_posix.cc:636 调用notify_on_read把read_closure的变量state_设置为tcp->read_done_closure)-->020(tcp_handle_read #tcp_posix.cc:619 epollin事件触发tcp_handle_read, epollin事件触发tcp_handle_read, 调用tcp_continue_read调用tcp_continue_read)

020(tcp_handle_read #tcp_posix.cc:619 epollin事件触发tcp_handle_read, epollin事件触发tcp_handle_read, 调用tcp_continue_read调用tcp_continue_read)-->021(tcp_continue_read #tcp_posix.cc:594 申请存放读内容的内存或者执行读操作, 此处申请内存)

021(tcp_continue_read #tcp_posix.cc:594 申请存放读内容的内存或者执行读操作, 此处申请内存)-->022(grpc_resource_user_alloc_slices #resource_quota.cc:1010 申请tcp->incoming_buffer内存)

022(grpc_resource_user_alloc_slices #resource_quota.cc:1010 申请tcp->incoming_buffer内存)-->023(grpc_resource_user_alloc #resource_quota.cc:939 上锁并调用resource_user_alloc_locked)

023(grpc_resource_user_alloc #resource_quota.cc:939 上锁并调用resource_user_alloc_locked)-->024(resource_user_alloc_locked #resource_quota.cc:905 调用allocate_closure的callback函数ru_allocate)

024(resource_user_alloc_locked #resource_quota.cc:905 调用allocate_closure的callback函数ru_allocate)-->025(ru_allocate #resource_quota.cc:485 调用rq_step_sched并把resource_user加入GRPC_RULIST_AWAITING_ALLOCATION对应的list)

025(ru_allocate #resource_quota.cc:485 调用rq_step_sched并把resource_user加入GRPC_RULIST_AWAITING_ALLOCATION对应的list)-->026(rq_step_sched #resource_quota.cc:296 调用rq_step_closure的callback函数rq_step)

026(rq_step_sched #resource_quota.cc:296 调用rq_step_closure的callback函数rq_step)-->027(rq_step #resource_quota.cc:281 调用rq_alloc)

027(rq_step #resource_quota.cc:281 调用rq_alloc)-->028(rq_alloc #resource_quota.cc:361 调用on_allocated这个list上所有的callback函数, 通过堆栈可以找到一个函数ru_allocated_slices)

028(rq_alloc #resource_quota.cc:361 调用on_allocated这个list上所有的callback函数, 通过堆栈可以找到一个函数ru_allocated_slices)-->029(ru_allocated_slices #resource_quota.cc:599 调用了ru_alloc_slices申请内存, 然后调用on_done的callback函数tcp_read_allocation_done, tcp_read_allocation_done在grpc_tcp_create设置)

029(ru_allocated_slices #resource_quota.cc:599 调用了ru_alloc_slices申请内存, 然后调用on_done的callback函数tcp_read_allocation_done, tcp_read_allocation_done在grpc_tcp_create设置)-->030(tcp_read_allocation_done #tcp_posix.cc:582 调用真正的读函数tcp_do_read, 在tcp_do_read中调用recvmsg 第二个参数结构是struct msghdr)

Unary模式下客户端从开始连接到发送接收数据的主要流程的更多相关文章

  1. Unary模式下客户端创建 default-executor 和 resolver-executor 线程和从启动到执行grpc_connector_connect的主要流程

    (原创)C/C/1.25.0-dev grpc-c/8.0.0, 使用的例子是自带的例子GreeterClient 创建 default-executor 和 resolver-executor 线程 ...

  2. grpc Unary模式下客户端创建insecure channel的主要流程

    (原创)C/C/1.25.0-dev grpc-c/8.0.0, 使用的例子是自带的例子GreeterClient grpc Unary模式下客户端创建insecure channel的主要流程 gr ...

  3. 安卓Socket连接实现连接实现发送接收数据,openwrt wifi转串口连接单片机实现控制

    安卓Socket连接实现连接实现发送接收数据,openwrt wifi转串口连接单片机实现控制 socket 连接采用流的方式进行发送接收数据,采用thread线程的方式. 什么是线程?  详细代码介 ...

  4. 烂泥:openvpn tun模式下客户端与内网机器通信

    本文由秀依林枫提供友情赞助,首发于烂泥行天下 前两篇文章我们介绍了有关openvpn的搭建与配置文件的讲解,这篇文章我们再聊介绍下,在tun模式下openvpn客户端如何与内网机器通信的问题. 一.实 ...

  5. golang连接activemq,发送接收数据

    介绍 使用golang连接activemq发送数据的话,需要使用一个叫做stomp的包,直接go get github.com/go-stomp/stomp即可 代码 生产者 package main ...

  6. vm虚拟机里的桥接模式下“复制物理网络连接状态”作用

    前提:真实主机可以上网 勾选,虚拟机也可以上网 不勾选,虚拟机不可以上网

  7. 简单记录下@RequestBody(关于它和@RequestParam接收数据方式的拓展)

    内容参考自博客:https://blog.csdn.net/ff906317011/article/details/78552426 这个标注是用来注释controller中的请求方法中的参数的,那么 ...

  8. NAT模式下VMware中CentOS7无法连接外网的解决方法

    故障现象 ----------------------------------------------------------------------------------------------- ...

  9. 痞子衡嵌入式:i.MXRT连接特殊Octal Flash时(OPI DTR模式下反转字节序)下载与启动注意事项(以MX25UM51245为例)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是OPI DTR模式下反转字节序的Octal Flash在i.MXRT下载与启动注意事项. 在恩智浦官方参考设计板 MIMXRT595-E ...

随机推荐

  1. 洛谷 P1099 树网的核+P2491 [SDOI2011]消防

    写在前面:由于是双倍经验就放一块了,虽然数据范围差的有点大. 题目链接 题意:在树的直径上选择一条长度不超过s的路径使这条路径上的点到树上任意点的最大距离最小. 这题数据好像非常水,我写了上界n^2不 ...

  2. create-react-app不支持less的解决方式

    进入node_modules\react-scripts\config目录 修改webpack.config.dev.js跟webpack.config.prod.js中关于loader的配置即可,注 ...

  3. SpringCloud:gateway网关模块启动报错

    1.错误信息 org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with na ...

  4. Django项目纪要

    开发流程 公司高层 项目立项 | 市场部门 需求分析-->需求分析说明书, 需求规格说明书 | 产品部门 产品原型-->产品 UI 前端 后端 测试 移动端 | |------------ ...

  5. UDP丢包原因总结

    丢包检查方法 给每个UDP包编号,对比收发端的接收到的包.对于UDP协议层上的包,例如RTP包,可以从RTP包中读出包的序列号进行判断. 抓包.发送端和接收端分别抓包.linux下可以使用tcpdum ...

  6. ethtool 强制设置网卡运行模式为100M

    ethtool -s eth0 autoneg off speed 100 duplex full

  7. 聊聊Dubbo(六):核心源码-Filter链原理

    转载:https://www.jianshu.com/p/6dd76ce7338f 0 前言 对于Java WEB应用来说,Spring的Filter可以拦截WEB接口调用,但对于Dubbo接口,Sp ...

  8. 阿里云mysql数据库恢复到本地

    本地环境为win10,mysql引擎为InnoDB 第一步:服务里面停掉mysql 第二步:把my.ini 的 innodb_force_recovery  设置为0 第三步:把.frm和.idb文件 ...

  9. Error-ASP.NET:未能加载文件或程序集“CMSCalendar”或它的某一个依赖项。系统找不到指定的文件。

    ylbtech-Error-ASP.NET:未能加载文件或程序集“CMSCalendar”或它的某一个依赖项.系统找不到指定的文件. 1.返回顶部 1. “/”应用程序中的服务器错误. 分析器错误 说 ...

  10. 几个简单易用的IDEA快捷键

    常见的几个Idea的代码快捷键 格式化代码: Ctrl + Alt + L Optimize Imports(优化包引用): Ctrl-Alt-O 单行注释(//): Ctrl-/ 块注释(/*... ...