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

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

【amqp_open_socket 】

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

?


1

2

3

4

5

6

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。

?


1

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 即可。

?


1

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 的进一步研究。

时间: 2024-10-28 11:43:00

【原创】rabbitmq-c源码分析之amqp_socket.c的相关文章

jQuery源码分析-03构造jQuery对象-工具函数_jquery

作者:nuysoft/高云 QQ:47214707 EMail:nuysoft@gmail.com 声明:本文为原创文章,如需转载,请注明来源并保留原文链接. 读读写写,不对的地方请告诉我,多多交流共同进步,本章的的PDF等本章写完了发布. jQuery源码分析系列的目录请查看 http://nuysoft.iteye.com/blog/1177451,想系统的好好写写,目前还是从我感兴趣的部分开始,如果大家有对哪个模块感兴趣的,建议优先分析的,可以告诉我,一起学习. 3.4 其他静态工具函数

写在HBase源码分析前面的话

       本版块全部为HBase1.0.2相关源码分析文章,系个人研究源码原创写成,除对部分引用标示外,其余均为原创,或翻译源码注释.        该系列文章为与网友交流HBase学习,不做任何其他商业用途~~O(∩_∩)O哈哈~         由于水平有限,文章基本上是边读源码,边翻译注释,边分析源码写成,没有较强的前后逻辑性,我会在写完全部文章后再回头整理.         由于水平有限,文章中可能存在理解错误的地方,欢迎各位针对文章中的错误.问题或者其他指导建议,踊跃评论,多多指点

Spark源码分析:多种部署方式之间的区别与联系(1)

<http://www.aliyun.com/zixun/aggregation/13383.html">Spark源码分析:多种部署方式之间的区别与联系(1)> <Spark源码分析:多种部署方式之间的区别与联系(2)> 从官方的文档我们可以知道,Spark的部署方式有很多种:local.Standalone.Mesos.YARN-..不同部署方式的后台处理进程是不一样的,但是如果我们从代码的角度来看,其实流程都差不多. 从代码中,我们可以得知其实Spark的部署

Epoll详解及源码分析【转】

  转自:http://blog.csdn.net/chen19870707/article/details/42525887 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[-]   什么是epoll   Apache模型Process Per Connection简称PPC 和 TPCThread Per Connection模型 select模型 poll模型 epoll模型 Epoll API int epoll_createint size int epoll_c

springboot源码分析6-springboot之PropertySource类初探

摘要:本小节重点梳理一下PropertySource类的相关结构以及职责,本文的学习前提是学习了springboot源码分析5-springboot之命令行参数以及原理一文. 在springboot源码分析5-springboot之命令行参数以及原理一文中,我们看到了实例化Source类的时候,会去先实例化其父类SimpleCommandLinePropertySource.SimpleCommandLinePropertySource类的构造函数中直接解析了命令行参数以及值,然后返回封装好的C

springboot源码分析3-springboot之banner类架构以及原理

继续上文的<<springboot源码分析2-springboot 之banner定制以及原理章节>>进行讲解,上一节我们详细详解了banner的三种输出模式.banner的输出模式设置.banner类的架构.SpringApplicationBannerPrinter类.ImageBanner以及TextBanner的处理方式.本小节我们来重点讲解一下各种banner处理类的相关实现逻辑以及设计意图和职责. 1.1 SpringBootBanner类 SpringBootBann

springboot源码分析10-ApplicationContextInitializer使用

摘要:spring中ApplicationContextInitializer接口是在ConfigurableApplicationContext刷新之前初始化ConfigurableApplicationContext的回调接口.当spring框架内部执行 ConfigurableApplicationContext#refresh() 方法的时候回去回调. 1.1. 实现方式一 首先,我们需要自定义一个类并且实现ApplicationContextInitializer接口.示例代码如下:

springboot源码分析11-ApplicationContextInitializer原理

摘要:springboot源码分析10-ApplicationContextInitializer使用一文中,我们详细地讲解了ApplicationContextInitializer的三种使用方式,本文我们重点看一下为何这三种方式都可以使用,也就是框架是如何处理的.包括内置的ContextIdApplicationContextInitializer.DelegatingApplicationContextInitializer. 1.1. 用户手动添加ApplicationContextIn

springboot源码分析7-环境属性构造过程(上)

使用springboot的目的就是在项目开发中,快速出东西,因此springboot对于配置文件的格式支持是非常丰富的,最常见的配置文件后缀有如下四种:properties.xml.yml.yaml,比如我们在springboot项目根目录中配置了一个application.properties文件,则springboot项目启动的时候就会自动将该文件的内容解析并设置到环境中,这样后续需要使用该文件中配置的属性的时候,只需要使用@value即可.同理application.xml.applica