文档章节

【原创】rabbitmq-c源码分析之amqp_socket.c

摩云飞
 摩云飞
发布于 2013/01/25 11:24
字数 828
阅读 3.1K
收藏 1

行业解决方案、产品招募中!想赚钱就来传!>>>

     走读 amqp_socket.c 源码,发现若干值得注意的细节:

amqp_open_socket 

在 amqp_open_socket 函数中通过 getaddrinfo 函数进行域名解析可能会产生阻塞。其中参数指定了

struct addrinfo hint;
...
hint.ai_family = PF_UNSPEC; /* PF_INET or PF_INET6 */
hint.ai_socktype = SOCK_STREAM;
hint.ai_protocol = IPPROTO_TCP;
...

故其会对IPv4和IPv6地址均进行查询。

创建 socket 时的代码表明,其根据实际情况(IPv4或IPv6)创建对应的socket。

sockfd = (int)socket(addr->ai_family, addr->ai_socktype, addr->ai_protocol);

socket 创建后仅设置了 SO_NOSIGPIPE(该标识仅在 IOS 系统下有效) 和 TCP_NODELAY 选项,之后就进行了 connect 动作,说明该 socket 为阻塞式用法,并且未绑定本地任何地址。这样的结果是 connect 会根据连接到的对端地址自动绑定本地对应地址。

另外,由于处理的是阻塞式 socket ,故 connect 仅对出错返回进行了简单处理。唯一可能需要注意的,实现中没有 connect 重连机制,直接结果是对每一个地址仅尝试 connect 一次。


【amqp_send_header】

该函数仅需看一下 send 函数的 flags 即可。

send(state->sockfd, (void *)header, 8, MSG_NOSIGNAL);

设置 send 函数第三个参数为 MSG_NOSIGNAL ,即要求进程不把信号 SIGPIPE 发送给系统,而输出到终端。


【sasl_method_name】

该函数说明 rabbitmq-c 仅支持 PLAIN SASL ,其余扩展需要自己实现。


【sasl_response】

没啥好说的,只有 response_buf 的内容拼接格式看下就可以。


【wait_frame_inner】

该函数是当前 C 文件最核心的一个。其中包含了用于帧数据解析和生成的 amqp_handle_input 函数,以及用于接收数据 recv 函数。其中 recv 是阻塞点。在 sockfd 上收到的数据先缓存在 sock_inbound_buffer 中,随后会在 while 循环中按协议,逐个按帧解析出来,返回给上层。此代码写的挺精巧,可以学习借鉴。


【amqp_simple_wait_frame】

此函数是对 wait_frame_inner 的封装,并增加了对帧链表的检测和处理。意思是只要帧链表中还有数据待处理就先把其中的数据取出来处理,否则通过 wait_frame_inner 接收帧后再处理。


【amqp_simple_wait_method

此函数是对 amqp_simple_wait_frame 的封装,并增加了对帧的内容的检测和处理。


【amqp_send_method】

构造待发送帧的内容,内部使用 amqp_send_frame 来发送实际的帧数据。


【amqp_simple_rpc】

该函数是另一个需要留意的点。其内部通过调用 amqp_send_method 和 wait_frame_inner 实现了简单的 RPC 功能。

通过 wait_frame_inner 得到的帧不一定是 amqp_send_method 方法希望得到的应答帧,故需要对前者的返回内容进行相应的处理,包括对 channel 关闭、connection 关闭,以及非 method 帧的处理(放进帧链表)。只有在获得正确的应答帧后才返回。


【amqp_simple_rpc_decoded】

此函数是对 amqp_simple_rpc 的封装,仅增加了对数据的组织处理。


【amqp_login_inner】

该函数就是使用上述的函数实现了登陆流程中的各个动作:发送协议版本信息、进行 connection 处理、进行 SASL 处理、进行 TUNE 处理。详细请参考协议文档。


【amqp_login】

除了包含 amqp_login_inner 外,额外还增加了对 channel 信令的处理。


以上就是对 amqp_socket.c 内容的全部要点总结,相信有助于你对 rabbitmq-c 的进一步研究。






摩云飞
粉丝 378
博文 534
码字总数 952694
作品 0
徐汇
程序员
私信 提问
加载中
此博客有 1 条评论,请先登录后再查看。
Flappy Bird(安卓版)逆向分析(一)

更改每过一关的增长分数 反编译的步骤就不介绍了,我们直接来看反编译得到的文件夹 方法1:在smali目录下,我们看到org/andengine/,可以知晓游戏是由andengine引擎开发的。打开/res/raw/at...

enimey
2014/03/04
5.8K
18
beego API开发以及自动化文档

beego API开发以及自动化文档 beego1.3版本已经在上个星期发布了,但是还是有很多人不了解如何来进行开发,也是在一步一步的测试中开发,期间QQ群里面很多人都问我如何开发,我的业余时间实在...

astaxie
2014/06/25
2.7W
22
程序猿媛一:Android滑动翻页+区域点击事件

滑动翻页+区域点击事件 ViewPager+GrideView 声明:博文为原创,文章内容为,效果展示,思路阐述,及代码片段。文尾附注源码获取途径。 转载请保留原文出处“http://my.oschina.net/gluoyer...

花佟林雨月
2013/11/09
4.1K
1
实时分析系统--istatd

istatd是IMVU公司工程师开发的一款优秀的实时分析系统,能够有效地收集,存储和搜索各种分析指标,类似cacti,Graphite,Zabbix等系统。实际上,istatd修改了Graphite的存储后端,重新实现了...

匿名
2013/02/07
2.8K
1
日志分析平台 - Kibana

Kibana 是一个为 Logstash 和 ElasticSearch 提供的日志分析的 Web 接口。可使用它对日志进行高效的搜索、可视化、分析等各种操作。 环境要求: ruby >= 1.8.7 (probably?) bundler logstash...

匿名
2013/02/13
11.5W
1

没有更多内容

加载失败,请刷新页面

加载更多

Java基础—List集合的概念及使用方法

Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)。一些Collection允许相同的元素而另一些不行。一些能排序而另一些不行。Java SDK不提供直接继...

afreon
2018/08/01
0
0
MP3 tag编辑器-puddletag

puddletag是一款Linux平台下开源的音频标签编辑器。遵守GPL v3开源协议。类似于Windows平台下的Mp3tag软件,表格的界面更适合批量修改音乐tag。支持从文件名里提取为tag信息,或者根据Tag信息...

osc_tnexgcb8
9分钟前
0
0
java实现淘宝模拟登陆

java实现淘宝模拟登陆 目录 java实现淘宝模拟登陆 一、前期准备 1. 工具 2. 下载浏览器驱动 3. 导入Maven依赖 二、具体代码 三、参考: 一、前期准备 1. 工具 IDE(笔者使用IDEA ) Maven 浏览...

osc_m53xdida
10分钟前
0
0
PHP+Redis链表解决高并发下商品超卖问题

目录 实现原理 实现步骤 上一篇文章聊了一下使用Redis事务来解决高并发商品超卖问题,今天我们来聊一下使用Redis链表来解决高并发商品超卖问题。 实现原理 使用redis链表来做,因为pop操作是...

osc_urkxdqms
11分钟前
0
0
Unity 用ml-agents机器学习造个游戏AI吧(2) (深度强化学习入门DEMO)

目录 本次示例:训练一个追踪红球的白球AI 1. 新建Unity项目,导入package 2. 编写Agent脚本 void OnEpisodeBegin() void CollectObservations(VectorSensor sensor) void OnActionReceived(......

osc_wxsc35it
13分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部