文档章节

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

摩云飞
 摩云飞
发布于 2013/01/25 11:24
字数 828
阅读 2377
收藏 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 的进一步研究。






© 著作权归作者所有

共有 人打赏支持
摩云飞
粉丝 367
博文 534
码字总数 952694
作品 0
徐汇
程序员
私信 提问
加载中

评论(1)

就是小强
楼主你好,我想请教一下rabbitmq-c里面有没有实现异步接收消息这种功能,如果我要想在里面实现这种机制该怎么做呢?谢谢!
【原创】抓包分析RabbitMQ的帧数据构成

本文仅记录研究rabbitmq-c客户端源码时,对RabbitMQ帧数据构成进行总结。 先上一张图: 上图是rabbitmq-c客户端与服务器进行初始信令交互时的抓包,在此仅此作为示例使用。其中图中所示为第一...

摩云飞
2013/01/24
0
3
RabbitMQ第四课 多线程收发异常

异常 Internal error: unable to determine timeout reason 场景 在调用rabbitMQ接收数据的时候,出现如上的错误。代码断点在amqpconsumemessage函数,发现如果consume阻塞时,其他线程用该s...

fengyuzaitu
07/19
0
0
CentOS安装RabbitMQ及PHP扩展

开发环境 CentOS7.3 安装RabbitMQ服务端 安装完成后可以使用systemctl系列命令进行管理操作 安装rabbitmq-c 在安装amqp之前还需要安装另外一个通讯扩展rabbitmq-c。 去github下载最新版本(目...

一个向往前端的后端工程师
08/27
0
0
Centos安装rabbitmq的php扩展

主要是两个包 1.rabbitmq-c的包 2.amqp的包 下载 首先是rabbitmq-c-0.4.1.tar.gz包,可以访问https://github.com/alanxz/rabbitmq-c去下载最新的 wget https://github.com/alanxz/rabbitmq-c/......

庆沉
2014/09/11
0
0
Centos安装rabbitmq的php扩展

前边我们介绍过怎么安装rabbitmq,但是想用php来调用rabbitmq可是没那么简单了,整整搞了一个下午才搞定.... 主要是两个包 1.rabbitmq-c的包 2.amqp的包 下载 首先是rabbitmq-c-0.4.1.tar.gz包...

mac_zhao
2014/09/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

apache顶级项目(二) - B~C

apache顶级项目(二) - B~C https://www.apache.org/ Bahir Apache Bahir provides extensions to multiple distributed analytic platforms, extending their reach with a diversity of s......

晨猫
今天
3
0
day152-2018-11-19-英语流利阅读

“超级食物”竟然是营销噱头? Daniel 2018-11-19 1.今日导读 近几年来,超级食物 superfoods 开始逐渐走红。不难发现,越来越多的轻食餐厅也在不断推出以超级食物为主打食材的健康料理,像是...

飞鱼说编程
今天
8
0
SpringBoot源码:启动过程分析(二)

接着上篇继续分析 SpringBoot 的启动过程。 SpringBoot的版本为:2.1.0 release,最新版本。 一.时序图 一样的,我们先把时序图贴上来,方便理解: 二.源码分析 回顾一下,前面我们分析到了下...

Jacktanger
昨天
3
0
Apache防盗链配置,Directory访问控制,FilesMatch进行访问控制

防盗链配置 通过限制referer来实现防盗链的功能 配置前,使用curl -e 指定referer [root@test-a test-webroot]# curl -e "http://www.test.com/1.html" -x127.0.0.1:80 "www.test.com/1.jpg......

野雪球
昨天
5
0
RxJava threading

因为Rx针对异步系统设计,并且Rx也自然支持多线程,所以新的Rx开发人员有时会假设Rx默认是多线程的。在其他任何事情之前,重要的是澄清Rx默认是单线程的。 除非另有说明,否则每次调用onNex...

woshixin
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部