设为首页收藏本站

Erlang中文论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 22958|回复: 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好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-21 17:57 , Processed in 0.363649 second(s), 8 queries , File On.

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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