ranch 源码分析(二)

接上ranch 源码分析(一)

上次讲到了ranch.erl的start_listener函数,下面我们详细分析下这个函数

-module(ranch).
%...... 省略若干行
-spec start_listener(ref(), non_neg_integer(), module(), any(), module(), any())
    -> supervisor:startchild_ret().
start_listener(Ref, NbAcceptors, Transport, TransOpts, Protocol, ProtoOpts)
        when is_integer(NbAcceptors) andalso is_atom(Transport)
        andalso is_atom(Protocol) ->
    _ = code:ensure_loaded(Transport),
    %% @todo Remove in Ranch 2.0 and simply require ssl.
    _ = ensure_ssl(Transport),
    case erlang:function_exported(Transport, name, 0) of
        false ->
            {error, badarg};
        true ->
            Res = supervisor:start_child(ranch_sup, child_spec(Ref, NbAcceptors,
                    Transport, TransOpts, Protocol, ProtoOpts)),
            Socket = proplists:get_value(socket, TransOpts),
            case Res of
                {ok, Pid} when Socket =/= undefined ->
                    %% Give ownership of the socket to ranch_acceptors_sup
                    %% to make sure the socket stays open as long as the
                    %% listener is alive. If the socket closes however there
                    %% will be no way to recover because we don‘t know how
                    %% to open it again.
                    Children = supervisor:which_children(Pid),
                    {_, AcceptorsSup, _, _}
                        = lists:keyfind(ranch_acceptors_sup, 1, Children),
                    %%% Note: the catch is here because SSL crashes when you change
                    %%% the controlling process of a listen socket because of a bug.
                    %%% The bug will be fixed in R16.
                    catch Transport:controlling_process(Socket, AcceptorsSup);
                _ ->
                    ok
            end,
            Res
    end.

%...... 省略若干行
-spec child_spec(ref(), non_neg_integer(), module(), any(), module(), any())
    -> supervisor:child_spec().
child_spec(Ref, NbAcceptors, Transport, TransOpts, Protocol, ProtoOpts)
        when is_integer(NbAcceptors) andalso is_atom(Transport)
        andalso is_atom(Protocol) ->
    %% @todo Remove in Ranch 2.0 and simply require ssl.
    _ = ensure_ssl(Transport),
    {{ranch_listener_sup, Ref}, {ranch_listener_sup, start_link, [
        Ref, NbAcceptors, Transport, TransOpts, Protocol, ProtoOpts
    ]}, permanent, infinity, supervisor, [ranch_listener_sup]}.

%...... 省略若干行
时间: 2024-08-29 05:53:06

ranch 源码分析(二)的相关文章

ranch 源码分析(三)

接上ranch 源码分析(二) 上次讲到了ranch_conns_sup和ranch_acceptors_sup这2个ranch的核心模块,我们接着分析 首先查看ranch_conns_sup.erl -module(ranch_conns_sup). %% API. -export([start_link/6]). -export([start_protocol/2]). -export([active_connections/1]). %...... 省略若干行 %% API. -spec

netty 源码分析二

以服务端启动,接收客户端连接整个过程为例分析, 简略分为 五个过程: 1.NioServerSocketChannel 管道生成, 2.NioServerSocketChannel 管道完成初始化, 3.NioServerSocketChannel注册至Selector选择器, 4.NioServerSocketChannel管道绑定到指定端口,启动服务 5.NioServerSocketChannel接受客户端的连接,进行相应IO操作 Ps:netty内部过程远比这复杂,简略记录下方便以后回忆

[Android]Volley源码分析(二)Cache

Cache作为Volley最为核心的一部分,Volley花了重彩来实现它.本章我们顺着Volley的源码思路往下,来看下Volley对Cache的处理逻辑. 我们回想一下昨天的简单代码,我们的入口是从构造一个Request队列开始的,而我们并不直接调用new来构造,而是将控制权反转给Volley这个静态工厂来构造. com.android.volley.toolbox.Volley: public static RequestQueue newRequestQueue(Context conte

哇!板球 源码分析二

游戏主页面布局 创建屏下Score标签 pLabel = CCLabelTTF::create("Score", "Arial", TITLE_FONT_SIZE); //分数标签 //设置标签字体的颜色 pLabel->setColor (ccc3(0, 0, 0)); //设置文本标签的位置 pLabel->setPosition ( ccp ( SCORE_X, //X坐标 SCORE_Y //Y坐标 ) ); //将文本标签添加到布景中 this

baksmali和smali源码分析(二)

这一节,主要介绍一下 baksmali代码的框架. 我们经常在反编译android apk包的时候使用apktool这个工具,其实本身这个工具里面对于dex文件解析和重新生成就是使用的baksmali 和smali这两个jar包其中 baksmali是将 dex文件转换成便于阅读的smali文件的,具体使用命令如下:java -jar baksmali.jar classes.dex -o myout其中myout是输出的文件夹 而smali是将smali文件重新生成回 dex文件的具体使用的命

【梦幻连连连】源码分析(二)

转载请注明出处:http://blog.csdn.net/oyangyufu/article/details/24736711 GameLayer场景界面效果: 源码分析: GameLayer场景初始化,主要是初始化加载界面及背景音乐 bool GameLayer::init() { float dt=0.0f; if ( !CCLayerColor::initWithColor(ccc4(255, 255, 255, 255))) { return false; } this->initLoa

[Android]Fragment源码分析(二) 状态

我们上一讲,抛出来一个问题,就是当Activity的onCreateView的时候,是如何构造Fragment中的View参数.要回答这个问题我们先要了解Fragment的状态,这是Fragment管理中非常重要的一环.我们先来看一下FragmentActivity提供的一些核心回调: @Override protected void onCreate(Bundle savedInstanceState) { mFragments.attachActivity(this, mContainer,

JAVA Collection 源码分析(二)之SubList

昨天我们分析了ArrayList的源码,我们可以看到,在其中还有一个类,名为SubList,其继承了AbstractList. // AbstractList类型的引用,所有继承了AbstractList都可以传进来 private final AbstractList<E> parent; // 这个是其实就是parent的偏移量,从parent中的第几个元素开始的 private final int parentOffset; private final int offset; int s

ranch 源码分析(完)

接上 ranch 源码分析(三) 在上一次,根据ranch源码把大概流程理了一遍,下面我们将一些细节解释一下. ranch只是一个服务的框架,它提供了传输层协议代码(ranch_tcp 和ranch_ssl), 大概可以看看这2个的源码,其实就是gen_tcp和gen_ssl的封装. 它做的工作可以分成 1.根据port配置开启一个端口的linsten,(具体见ranch_acceptors_sup.erl代码) 2.然后开启N个(根据设置)进程accpet等待client的连接, (具体见ra