加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 大数据 > 正文

ejabberd源码分析《三》客户端数据处理

发布时间:2021-05-27 15:00:45 所属栏目:大数据 来源:网络整理
导读:副标题#e# 参考 http://www.cnblogs.com/yjl49/archive/2011/09/02/2371964.html 1.客户端连接服务器后,发送消息给服务器的xml数据处理在ejabberd_c2s中。 ?? ejabberd_c2s 是一个gen_fsm 状态机,在socket连接建立之后创建。 ?? 初始状态为 wait_for_stre

2.下面是比较关键的ejabberd中函数调用的分析:

  1. ?????????????run_fold(Hook,?Host,?Val,?Args)?->??
  2. ??????????????????case?ets:lookup(hooks,?{Hook,?Host})?of??
  3. ?????????????????????????[{_,?Ls}]?->run_fold1(Ls,?Hook,?Args);??
  4. ?????????????????????????[]?->Val??
  5. ??????????????????end.??
  6. e="code"?class="plain">PresenceEl?=?ejabberd_hooks:run_fold(??
  7. c2s_update_presence,??
  8. Server,??
  9. NewEl,??
  10. [User,?Server])??
在系统的ets库(内存中的一个数据库)中存有一个名为hooks的表,通过ets:lookup(hooks,{Hook,Host}) 可以找到一个 {_,Ls}的元组 (找不到就直接返回预定义的Val了),然后调用run_fold1(Ls,Hook,Val,Args).

Ls变量实际上是一个包含多个要具体调用的函数定义的列表,列表里面的元组分为两类:[{_Seq,Node,Moudle,Function} | Ls2]? [{_Seq,Module,Function} | Ls2],

run_fold1/4 的作用就是使用Args参数依次调用这个Ls列表里的方法.

run_fold1/4 最终会返回调用的结果出来.

所以从最终结果来看 ejabberd_hooks:run_fold/4? 方法就是去表hooks查找并调用所需的函数返回调用结果.

  1. PresenceEl?=?ejabberd_hooks:run_fold(??
  2. ???????????????????????c2s_update_presence,??
  3. ???????????????????????Server,??
  4. ???????????????????????NewEl,??
  5. ???????????????????????[User,?Server])??
针对上面的代码就是:

??????? 使用{c2s_update_presence,Server}作为key 在表hooks 中查找 要调用的方法列表,并使用[User,Server] 作为参数进行调用.


这个key具体找到什么样的方法呢? 我们可以在源码中查找下:

  1. root@ubuntu:??grep?*.erl?-e?c2s_update_presence??

查找结果中可以看到

mod_vcard_xupdate.erl?????????????? ejabberd_hooks:add(c2s_update_presence,Host


我们在mod_vcard_xupdate.erl中找到这段代码:

  1. start(Host,?_Opts)?->??
  2. ????mnesia:create_table(vcard_xupdate,??
  3. ????????????????????????[{disc_copies,?[node()]},??
  4. ?????????????????????????{attributes,?record_info(fields,?vcard_xupdate)}]),??
  5. ????ejabberd_hooks:add(c2s_update_presence,??
  6. ????????????????MODULE,?update_presence,?100),??
  7. ????ejabberd_hooks:add(vcard_set,?vcard_set,??
  8. ????ok.??
update_presence就所我们所要找的方法了.

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读