`
yjl49
  • 浏览: 113990 次
社区版块
存档分类
最新评论

ejabberd分析(一)

阅读更多

1.客户端连接服务器,并发送消息给服务器的处理在ejabberd_c2s中。

ejabberd_c2s 是一个gen_fsm 状态机,在 ejabberd启动时装载。

初始状态为 wait_for_stream,接受形为 {xmlstreamstart, _Name, Attrs} 的消息,其他任何消息都会导致stop。

接受到连接请求,发送feature 请求后状态改为wait_for_feature_request 。

接受到feature 再发送challenge 后,状态改为 wait_for_sasl_response。

经过sasl鉴权后,状态改为 wait_for_stream, 此时 StateData#state.authenticated 已经不为false。

客户端重新发起<stream> 连接请求,服务器发送bind 消息,状态改为 wait_for_bind 。

客户端发送bind 与资源绑定,服务器按照策略验证是否允许相同的用户用不同的资源连接,通过后状态改为 wait_for_session。

客户端发送<iq> 消息创建session,服务器调用 ejabberd_sm:open_session 后将状态改为 session_established。

客户端发送普通的通信消息<iq>,<presence>,<message> 等,都通过session_established2/2 函数处理。

 

 

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

 


 


在系统的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查找并调用所需的函数返回调用结果.

 

 

针对上面的代码就是:

 

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

 

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

 


查找结果中可以看到

 

mod_vcard_xupdate.erl ejabberd_hooks:add(c2s_update_presence, Host

 

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

 


update_presence就所我们所要找的方法了.

 

 

 

 




  


  
分享到:
评论

相关推荐

    ejabberd源码

    ejabberd是一款强大的即时通讯服务器,它基于Jabber/XMPP协议,这使得ejabberd能够支持丰富的交互式通信功能,如文本聊天、音视频通话、群聊、文件传输等。作为一款开源软件,ejabberd遵循GPLv2许可证,允许用户自由...

    iOS xmpp ejabberd服务器

    此外,ejabberd支持自定义插件,可以满足特定需求,例如日志记录、用户行为分析等。开发者可以根据需求编写插件并与服务器集成。 总的来说,通过使用ejabberd服务器和XMPP协议,开发者可以在iOS应用中构建功能丰富...

    ejabberd 群聊 strophe.js 实现

    要深入学习和理解这个demo,你需要阅读和分析这些文件中的代码,理解它们如何与ejabberd服务器交互以及如何展示群聊功能。 总结来说,ejabberd和strophe.js结合使用,可以在Web应用中实现强大的即时通信功能,包括...

    ejabberd中mod_privacy_odbc.erl实现没有完全遵循xmpp协议

    ejabberd是一款开源的XMPP服务器,广泛用于构建实时通信系统。在ejabberd中,`mod_privacy_odbc.erl`是用于处理用户隐私列表模块的一部分,该模块与数据库(通常通过ODBC接口)交互来存储和管理用户的隐私设置。然而...

    ejabberd-load-test

    ejabberd是一款开源的XMPP服务器,广泛用于构建实时通信系统,如即时消息、协作应用等。负载测试是评估ejabberd...通过分析这些内容,我们可以深入了解ejabberd的负载测试实践,从而更好地优化和管理ejabberd服务器。

    smack_src_3_2_2.tar.gz

    - Smack支持多种XMPP服务器,如Openfire、ejabberd等,并且可以与Jabber客户端兼容。 - 源码中包含了丰富的示例代码,帮助开发者快速上手并理解其工作原理。 2. **XMPP协议**: - XMPP是一种基于XML的实时通信...

    Elang 集群信息记录器

    Elang是一种动态类型的函数式编程语言,常用于构建高并发、分布式系统,如著名的开源通信平台 ejabberd 和数据库系统 Mnesia。在Elang集群中,每个节点都可以作为服务的一部分,协同工作以实现大规模的可扩展性和...

    exosip_c++.tar.tgz

    1. **exosip库**:Exosip是ejabberd通信服务器的一部分,是一个开源的SIP栈,用于处理SIP协议。它提供了处理SIP消息、注册、呼叫、会话管理和错误处理等功能。使用exosip库,开发者可以方便地在C或C++应用中实现SIP...

    jwchat-1.0beta3.rar_ajax jabber_jwchat_jwchat-1.0_openfire

    该客户端不仅兼容ejabberd服务器,这是一款用Erlang编写的强大、可扩展的即时通讯服务器,还能够与Openfire服务器无缝集成。Openfire是基于Java的XMPP服务器,以其易用性和高性能而受到赞誉。这意味着JWChat 1.0 ...

    android xmpp推送

    6. **Android DEMO分析**:提供的DEMO可能包含一个简单的登录和发送/接收消息的功能,但可能不涵盖所有实际应用所需的复杂性,如错误处理、离线消息存储、多设备同步等。开发者需要根据DEMO中的代码进行扩展和优化,...

    简单的基于XMPP协议的即时通信的实现

    标题 "简单的基于XMPP协议的即时通信的实现" 指出我们将探讨如何利用XMPP(Extensible Messaging...通过学习和分析这些代码,开发者可以更深入地理解XMPP协议的工作原理,并且可以以此为基础开发更复杂的即时通信应用。

    androidpn服务端项目源码已修改

    总的来说,这个修改过的AndroidPN服务端项目源码为开发者提供了一次学习和实践推送通知服务的机会,通过分析和理解代码,可以提升Android应用的实时通信能力和后台服务的构建技能。同时,对于想要自建推送服务的...

    XMPP研究.zip

    “XMPP研究”压缩包内的资料可能会涵盖以上提到的各个方面,包括XMPP协议规范的详细解释、开发实践、案例分析以及可能的代码示例。通过学习这些内容,你可以深入了解XMPP的工作原理,并具备开发基于XMPP的应用程序的...

    androidpn消息推送源码

    XMPP服务器如Openfire或ejabberd负责处理客户端之间的通信,确保消息的正确路由。 2. **AndroidPN架构**:AndroidPN由客户端和服务端两部分组成。客户端主要负责注册、登录、接收推送消息等功能;服务端则负责处理...

    android高仿QQ的即时通讯(附带服务端).zip

    1. **服务端建设**:服务端采用的是XMPP服务器,如Openfire或ejabberd。这些服务器支持用户注册、认证、会话管理和消息路由。开发者需要配置服务器,创建必要的数据库结构,以及设置安全策略,如SSL加密通信,确保...

    仿微信的Demo服务器端源码

    2. **XMPP服务器软件**:可能是诸如Openfire、ejabberd或Smack等开源XMPP服务器的定制版本。 3. **路由和处理逻辑**:处理客户端请求的服务器端脚本,可能用Java、Python、Node.js等编写,实现用户认证、消息路由、...

    Erlang高级应用和原理

    Erlang的系统由编译器、库、VM、调试器、性能分析工具和一系列工具组成,它们共同构建了一个高效且可靠的环境。 Erlang的高性能和高可靠性是其核心优势。它可以在单个CPU上处理超过16000个并发请求,相比之下,即使...

    精典源码之基于XMPP的即时聊天项目.rar

    下载后,开发者可以直接查看和分析代码,学习如何在实际项目中应用XMPP技术。 【标签】:(空白) 虽然没有给出具体的标签,但我们可以通过标题推测,相关的标签可能包括“即时通讯”、“XMPP”、“Java”(因为...

    XMPP研究毕业设计—(包含完整源码可运行).zip

    - **服务器端实现**:可能是用开源的XMPP服务器软件如ejabberd、Openfire或Prosody搭建的,也可能自定义开发了一部分功能。 - **客户端实现**:可能是一个桌面应用或移动端应用,实现了XMPP协议的全部或部分功能,如...

Global site tag (gtag.js) - Google Analytics