设为首页收藏本站

Erlang中文论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 19840|回复: 0

ranch初窥3

[复制链接]
发表于 2018-7-13 17:27:24 | 显示全部楼层 |阅读模式
# 接《ranch初窥2》#
- 从我的有道云笔记转过来的, 可以直接访问连接http://note.youdao.com/noteshare?id=20b0bc4806aed935da3f258816eae7da&sub=AF84BFF80C114F3898D6FC07648EEC99
## ranch_acceptors_sup.erl ##
从ranch\_server中获取ranch\_conns\_sup的进程,并且获取监听参数TransOpts,如果ranch\_server中尚未有监听socket,则启动监听socket,接着把监听socket记录到ranch\_server中,启动一个ranch\_acceptor子进程。

## ranch_acceptor.erl ##
启动一个loop/3循环,当接收到客户端的socket之后,把socket的控制进程改为连接监控进程ranch\_conns\_sup,连接监控进程中有对应的一些消息处理,接着调用ranch\_conns\_sup:start\_protocol/2发送{?MODULE, start\_protocol, self(), Socket},ranch\_conns\_sup进程自身对该消息进行处理,详情看ranch\_conns\_sup.erl的介绍,至此,ranch的监听端口的工作都已经准备完毕,(发现还有部分忽略了,需要实现ranch_protocol行为才能处理客户端消息的)现在就差客户端的连接进来了。
```
-spec loop(inet:socket(), module(), pid()) -> no_return().
loop(LSocket, Transport, ConnsSup) ->
        _ = case Transport:accept(LSocket, infinity) of
                {ok, CSocket} ->
                        case Transport:controlling_process(CSocket, ConnsSup) of
                                ok ->
                                        %% 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);
                                {error, _} ->
                                        Transport:close(CSocket)
                        end;
                %% 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} ->
                        error_logger:warning_msg("Ranch acceptor reducing accept rate: out of file descriptors~n"),
                        receive after 100 -> 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).
```

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|Erldoc.com  

GMT+8, 2024-4-19 09:09 , Processed in 0.434586 second(s), 9 queries , File On.

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表