2008年4月1日星期二

ejabberd源码阅读笔记

ejabberd_sup

ejabberd_sup是ejabberd的进程监视者(),由ejabberd_app创建。

supervisor(监视进程)

supervisor的功能是启动,停止和监控它的子进程。其作用是保持其子进程运行,在必要的时候重启其子进程,例如子进程死掉的时候。

A supervisor is responsible for starting, stopping and monitoring its child processes. The basic idea of a supervisor is that it should keep its child processes alive by restarting them when necessary.

ejabberd_sup负责创建一堆的子进程并监视它们,这些进程有:

ejabberd_hooks,ejabberd_node_groups,ejabberd_system_monitor,ejabberd_router,ejabberd_sm,ejabberd_s2s,ejabberd_local,

ejabberd_listener,ejabberd_receiver_sup,ejabberd_c2s_sup,ejabberd_s2s_in_sup,ejabberd_s2s_out_sup,ejabberd_service_sup,

ejabberd_http_sup,ejabberd_http_poll_sup,ejabberd_frontend_socket_sup,ejabberd_iq_sup,ejabberd_tmp_sup

 

这些进程大部分也是以sup结尾的supervisor监视进程.

ejabberd_listener

ejabberd_listener是由ejabberd_sup创建的一个supervisor进程,他负责监视和创建一系列的网络端口监听进程。

ejabberd_listener创建的端口监听进程列表是由配置文件中的listen读取的,配置文件样例如下:

{listen,
[
  {4222, ejabberd_c2s, [
                        %%
                        %% If TLS is compiled and you installed a SSL
                        %% certificate, put the correct path to the
                        %% file and uncomment this line:
                        %%
                        %%{certfile, "/path/to/ssl.pem"}, starttls,
                        {access, c2s},
                        {shaper, c2s_shaper},
                        {max_stanza_size, 65536}
                       ]},

{5269, ejabberd_s2s_in, [
                          {shaper, s2s_shaper},
                          {max_stanza_size, 131072}
                         ]},

{5280, ejabberd_http, [
                        http_poll,
                        web_admin,
                        {request_handlers, [{["httpbind"], mod_http_bind},{["pub", "archive"], mod_http_fileserver}]}
                       ]},
{5347, ejabberd_service, [{host, "msn-transport.bucc.cn", [{password, "1j5llz!o"}]}]}
]}.

每个进程的格式如下,{port_no,module_name,[args]}

port_no:端口号,同时也是创建进程时的进程标识

module_name:进程模块名称

args:参数列表

 

ejabberd_receiver

ejabberd_receiver是一个gen_server进程(behaviour),由ejabberd_socket创建

xml_stream

ejabber_c2s

ejabber_cs2是一个gen_fsm(有限状态机),维护一系列client和server之间的状态。gen_fsm的状态改变是由gen_fsm:send_event(FsmRef, Event)触发的。在ejabberd里,ejabberd_receiver通过xml_stream把事件和xml发送至ejabber_c2s改变其状态。

ejabber_c2s有限状态机的初始状态是wait_for_stream,其余的状态有:

wait_for_auth,wait_for_feature_request,wait_for_sasl_response,wait_for_bind,wait_for_session,session_established

 

关于帐户免域登录:

将来如果需要添加这个功能,可以修改在ejabberd_c2s的代码实现这个功能,在wait_for_stream状态时,在给客户端发送stream:features的时候附上域名,这样客户端就可以登录的时候附上取得的域了,或者是直接在ejabberd_auth模块实现这个功能?

1 条评论:

jessinio 说...

想请教你一点关于jabber/xmpp方面的问题, 能加我的Gtalk吗? jessinio (AT) gmail.com