Unary模式下客户端从开始连接到发送接收数据的主要流程
(原创)C/C语言, 平台是debian10, grpc版本:grpc-c/1.25.0-dev grpc-c/8.0.0, 使用的例子是自带的例子GreeterClient
grpc Unary模式下客户端从开始连接到发送数据的主要流程
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模式下客户端从开始连接到接收数据的主要流程
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模式下客户端从开始连接到发送接收数据的主要流程的更多相关文章
- Unary模式下客户端创建 default-executor 和 resolver-executor 线程和从启动到执行grpc_connector_connect的主要流程
(原创)C/C/1.25.0-dev grpc-c/8.0.0, 使用的例子是自带的例子GreeterClient 创建 default-executor 和 resolver-executor 线程 ...
- grpc Unary模式下客户端创建insecure channel的主要流程
(原创)C/C/1.25.0-dev grpc-c/8.0.0, 使用的例子是自带的例子GreeterClient grpc Unary模式下客户端创建insecure channel的主要流程 gr ...
- 安卓Socket连接实现连接实现发送接收数据,openwrt wifi转串口连接单片机实现控制
安卓Socket连接实现连接实现发送接收数据,openwrt wifi转串口连接单片机实现控制 socket 连接采用流的方式进行发送接收数据,采用thread线程的方式. 什么是线程? 详细代码介 ...
- 烂泥:openvpn tun模式下客户端与内网机器通信
本文由秀依林枫提供友情赞助,首发于烂泥行天下 前两篇文章我们介绍了有关openvpn的搭建与配置文件的讲解,这篇文章我们再聊介绍下,在tun模式下openvpn客户端如何与内网机器通信的问题. 一.实 ...
- golang连接activemq,发送接收数据
介绍 使用golang连接activemq发送数据的话,需要使用一个叫做stomp的包,直接go get github.com/go-stomp/stomp即可 代码 生产者 package main ...
- vm虚拟机里的桥接模式下“复制物理网络连接状态”作用
前提:真实主机可以上网 勾选,虚拟机也可以上网 不勾选,虚拟机不可以上网
- 简单记录下@RequestBody(关于它和@RequestParam接收数据方式的拓展)
内容参考自博客:https://blog.csdn.net/ff906317011/article/details/78552426 这个标注是用来注释controller中的请求方法中的参数的,那么 ...
- NAT模式下VMware中CentOS7无法连接外网的解决方法
故障现象 ----------------------------------------------------------------------------------------------- ...
- 痞子衡嵌入式:i.MXRT连接特殊Octal Flash时(OPI DTR模式下反转字节序)下载与启动注意事项(以MX25UM51245为例)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是OPI DTR模式下反转字节序的Octal Flash在i.MXRT下载与启动注意事项. 在恩智浦官方参考设计板 MIMXRT595-E ...
随机推荐
- 在WinDbg中调试时如何查看类/结构对象成员的值
有时,当您调试应用程序时,会碰巧得到指向类的指针,该类只有几个成员变量,包括结构和其他类对象!如何看待内部类/结构变量成员的值??所以,这是提示.下面是用于演示命令的代码. struct testSt ...
- ent facebook 开源的golang orm 框架
ent 是facebook 开源的golang orm 框架,简单强大,具有提下特性 schema 即代码 方便的图遍历 静态类型以及显示api 多种存储引擎支持(当前是mysql,sqlite,以及 ...
- nginx 访问控制之 限速
nginx限速可以通过 ngx_http_limit_conn_module 和 ngx_http_limit_req_module 模块来实现限速的功能. 一.ngx_http_limit_conn ...
- 【CSP膜你赛】大逃亡
题目描述 魔王撒旦为了建立魔物的乐土,率领亚多拉玛雷克.艾谢尔.路西菲尔.以 及马纳果达这四位恶魔大元帅进攻人类世界.然而此时手持圣剑的勇者艾米莉亚出现了. 战败的魔王逃跑时穿越到了地球,以真奥贞夫 ...
- Redis简介及其安装
1.Redis NoSQL (Not noly SQL)不仅仅是SQL 属于非关系型数据库:Redis就属于非关系型数据库 传统的Mysql ,oracle ,sql server 等 都是关系型数据 ...
- 【技术博客】JWT的认证机制Django项目中应用
开发组在开发过程中,都不可避免地遇到了一些困难或问题,但都最终想出办法克服了.我们认为这样的经验是有必要记录下来的,因此就有了[技术博客]. JWT的认证机制Django项目中应用 这篇技术博客基于软 ...
- c++字符串输入格式总结
最近的几次笔试中,常常遇到一些输入的问题.下面说明一下几种情况. 1. 第一种就是常见的,输入数字序列,用空格分隔开,直到回车结束.这个之前一开始遇到的时候都是利用getline直接作为字符读入一行处 ...
- php 面试必备:各种缓存技术详解
这门课程以电商网站为例,通过具体场景模块实战,让你更系统的掌握缓存原理.使用场景等相关知识,帮助你构建完整的缓存知识体系,胜任实际开发中缓存的处理,提升代码性能! 从原理到场景 系统讲解PHP缓 ...
- gcc编译链接std::__cxx11::string和std::string的问题
今天公司的小伙伴遇到一个问题,这里做一个记录. 问题是这样的,他编译了公司的基础库,然后在程序中链接的时候遇到点问题,报错找不到定义. 用到的函数声明大概是这样的: void function(con ...
- android细节之android.intent.category.DEFAULT的使用
我们知道,实现android的Activity之间相互跳转需要用到Intent, Intent又分为显式Intent和隐式Intent, 显式Intent很简单,比如我在FirstActivity中想 ...