首页 技术 正文
技术 2022年11月15日
0 收藏 868 点赞 3,400 浏览 1766 个字

经过的前面的梳理,整个ranch框架的结构,大致有了一个清晰的脉络,即使我说的不是很清楚大家也基本能阅读懂源码。下面我继续分析剩下的的几个文件。

7.ranch_transport.erl

 这个文件是一个自定义的的erlang行为模式,主要规范实现这个行为模式的子类必须要实现那个函数,整个函数分为行为callback的定义,模块函数的定义. 模块函数的实现sendfile. 具体实现了这个行为模式定义的callback的模块有(ranch_tcp.erl,ranch_ssl.erl) 这两个文件。看对应的名字都能大致明白什么功能和作用。这两个文件我觉得是整个框架传输处理的核心模块。也是把gen_tcp 和ssl 两种 传输协议做了一个统一的对外的接口,便于对整个框架结构的处理。也便于对传输协议的扩展。在协议扩展后仍然能再框架下稳定运行起重要作用。假设我们要ranch 支持gen_udp 协议的话 也只需要一个模块使用gen_udp 对整个协议封装处理即可。ranch_transport 整个回调木块对网络传输块做了如下的高度抽象。连接,监听,应答,参数设置,数据接收,发送,文件发送,断开,关闭 等接口做了高度抽象的概括。可以说cowboy 从 http 到 https 轻松无缝切换,都得益于整个行为模式的抽象处理。

8.ranch_acceptor.erl  

start_link(LSocket, Transport, ConnsSup) ->
Pid = spawn_link(?MODULE, loop, [LSocket, Transport, ConnsSup]),
{ok, Pid}.

首先我们来看看start_link 的几个参数 第一个参数 连接监听的socket,第二个参数选择的传输协议 第三个参数连接监督,然后采用链接的方式开启一个线程。

flush() ->
receive Msg ->
error_logger:error_msg(
"Ranch acceptor received unexpected message: ~p~n",[Msg]),
flush()
after ->
ok
end.

这个文件中为什么会有flush()这个函数呢?首先这个函数主要是处理接受我们消息处理中不需要的消息,把消息信箱中比如攻击消息,等等其余无用的消息从消息信箱中移除,然后再几率日志。整个接受过程是一个0超时处理。如果整个没有这个刷新过程的话都存在一些垃圾消息存在于信箱,导致信箱消息不停的增大,内存不停的增加,最后导致内存消耗宕机。

最后我们来看看整个主循环

 loop(LSocket, Transport, ConnsSup) ->
_ = case Transport:accept(LSocket, infinity) of
{ok, CSocket} ->
Transport:controlling_process(CSocket, ConnsSup),
%% This call will not return until process has been started
%% AND we are below the maximum number of connections.
ranch_conns_sup:start_protocol(ConnsSup, CSocket);
%% Reduce the accept rate if we run out of file descriptors.
%% We can't accept anymore anyway, so we might as well wait
%% a little for the situation to resolve itself.
{error, emfile} ->
receive after -> ok end;
%% We want to crash if the listening socket got closed.
{error, Reason} when Reason =/= closed ->
ok
end,
flush(),
?MODULE:loop(LSocket, Transport, ConnsSup).

整个过程包括三个处理部分:第一步部分对socket accept 等待客户端连接,如果连接上以后启动一个连接处理的进程类。第二步清理消息信箱用无用的垃圾消息。第三部整个函数尾递归调用,继续等待客户端连接处理。

明天学习剩下的模块,并对整个零散的思维进行整体的梳理。

上一篇: linux管理权限
下一篇: flex 数字上标
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,910
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,435
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,250
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,061
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,693
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,731