`
langzhe
  • 浏览: 286099 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ejabberd:route去向

 
阅读更多

ejabberd_local在init中注册了一个服务,pid(self())和MODULE:FUNCTION保存在route表中。

ejabberd_router:route

ejabberd_router:do_route 判断domain (1)是路由还是(2)交给本地处理

(1)ejabberd_local:do_route:(1.1)用户不为空,(1.2)用户为空且资源为空,(1,3)其它路由返回错误

(2)ejabberd_sm:do_route:(2.1)bare JID,(2.2)full JID

 

ejabberd_route: 代码片段
319             case mnesia:dirty_read(route, LDstDomain) of                                                                                                 
320                 [] ->
321                     ejabberd_s2s:route(From, To, Packet);     %%处理不同域
322                 [R] ->
323                     Pid = R#route.pid,             %%处理同域 pid是ejabberd_local 的sefl(),MODULE是ejabberd_local.erl
324                     if
325                         node(Pid) == node() ->             
326                             case R#route.local_hint of         
327                                 {apply, Module, Function} ->       
328                                     Module:Function(From, To, Packet);                                                                                   
329                                 _ ->                               
330                                     Pid ! {route, From, To, Packet}                                                                                      
331                             end;                       
332                         is_pid(Pid) ->                     
333                             Pid ! {route, From, To, Packet};
334                         true ->                            
335                             drop                   
336                     end;
                             .......................处理集群.............
 

 

 

do_route(From, To, Packet) 

TO(JID)没有user由ejabberd_local处理

                    有user没有资源由ejabberd_sm处理

                    有user和资源由 直接发送

 

ejabberd_local:代码片段:

do_route(From, To, Packet) ->
    ?DEBUG("local route~n\tfrom ~p~n\tto ~p~n\tpacket ~P~n",
           [From, To, Packet, 8]),
    if
        To#jid.luser /= "" ->
            ejabberd_sm:route(From, To, Packet);
        To#jid.lresource == "" ->
            {xmlelement, Name, _Attrs, _Els} = Packet,
            case Name of
                "iq" ->
                    process_iq(From, To, Packet);
                "message" ->
                    ok;
                "presence" ->
                    ok;
                _ ->
                    ok
            end;
        true ->
            {xmlelement, _Name, Attrs, _Els} = Packet,
            case xml:get_attr_s("type", Attrs) of
                "error" -> ok;
                "result" -> ok;
                _ ->
                    ejabberd_hooks:run(local_send_to_resource_hook,
                                       To#jid.lserver,
                                       [From, To, Packet])
            end
        end.
0
1
分享到:
评论
1 楼 yjl49 2011-09-19  
jabber:iq:roster 添加路由的时候是用jabberd_sm:process_iq ,但在取的时候却是jabberd_local ?

gen_iq_handler:add_iq_handler(ejabberd_sm, Host, ?NS_ROSTER,
  ?MODULE, process_iq, IQDisc).


{From, To, Packet} ->
    LDstDomain = To#jid.lserver,
    case mnesia:dirty_read(route, LDstDomain) of
[] ->
    ejabberd_s2s:route(From, To, Packet);
[R] ->
    Pid = R#route.pid,
    if
node(Pid) == node() ->
    case R#route.local_hint of
{apply, Module, Function} ->
    Module:Function(From, To, Packet);

相关推荐

    docker-ejabberd:ejabberd Docker映像集

    docker-ejabberd:ejabberd Docker映像集

    docker-ejabberd:用于Ejabberd服务器的Dockerfile

    从版本16.12开始,ejabberd根据源树中包含的该容器的工作情况拥有自己的docker容器。 在此博客文章中查看更多内容。 我们可以期望将来对此进行更多的工作。 版本 当前版本: 21.01 Docker标记名称基于git分支和...

    ejabberd:ejabberd-XMPP和Web聊天

    ejabberd-XMPP和Web聊天 将与结合在一起的即时消息服务器,以创建支持强加密并与任何Web浏览器或专用XMPP客户端(例如,Pidgin)一起使用的实时聊天服务器。 ejabberd是功能强大的XMPP服务器,它支持群集,实时升级...

    ejabberd:带有 riak 后端的 ejabberd 集群

    ejabberd是一款高度可扩展、高性能的XMPP服务器,被广泛用于实时通讯系统,如即时消息、在线状态同步、视频聊天等。集群部署ejabberd可以提高服务的可用性和处理能力,满足大规模用户的需求。在本项目中,ejabberd与...

    ejabberd:埃贾伯德

    ejabberd 社区版 ejabberd 是一种分布式容错技术,允许创建大型即时消息应用程序。 该服务器可以在单个节点上可靠地支持数千个并发用户,并且旨在提供卓越的容错标准。 作为一种基于行业标准的开源技术,ejabberd 可...

    ejabberd:健壮,无处不在且可大规模扩展的消息平台(XMPP,MQTT,SIP服务器)

    ejabberd社区版 ejabberd是一种分布式容错技术,可以创建大型即时消息传递应用程序。 该服务器可以在单个节点上可靠地支持成千上万的同时用户,其设计旨在提供卓越的容错标准。 作为基于行业标准的开源技术,...

    xmljava系统源码-ejabberd:即时通讯的后端服务器。它是从ejabberd开发和定制的

    EJABBERD Startalk 的消息交换服务器是基于 ejabberd 开发的,根据业务需要改造而来。修改和扩展了很多 ejaberd 不支持的功能。 关键功能 分布式:去掉了依赖 mnesia 集群的代码,来支持更大的集群,以及防止由于...

    ejabberd安装配置[归纳].pdf

    Ejabberd安装配置详解 Ejabberd是一款流行的开源即时通讯服务器软件,具有高度灵活性和可扩展性。下面是Ejabberd安装配置的详细知识点解析: Ejabberd下载 Ejabberd的下载可以从官方网站获取,目前支持多种操作...

    ejabberd源码

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

    xmpp-auth:ejabberd 的外部认证脚本

    5. 配置Ejabberd:在Ejabberd的配置文件(`ejabberd.yml`)中,需要添加或修改以下部分来启用外部认证: ```yaml auth_method: external external_auth_service: 'script' external_auth_commands: - "/path/to...

    ejabberd windows installer

    ejabberd是一款开源的XMPP服务器,它基于Erlang编程语言,提供高度可扩展性和高并发处理能力。在Windows环境下,ejabberd通常通过安装程序进行部署,这正是"ejabberd windows installer"所涉及的内容。Ejabberd不...

    ejabberd 服务器测试客户端spark

    ejabberd是一款开源的XMPP服务器,广泛用于构建实时通信系统,如即时消息、VoIP、协作工具等。在部署ejabberd服务器后,为了确保其正确配置和功能正常,通常需要一个客户端来进行测试。在这个场景中,"ejabberd ...

    ejabberd-debian:Debian 的 ejabberd 软件包

    ejabberd - 高性能企业即时消息服务器快速入门指南要求要编译 ejabberd,您需要: GNU 制造海湾合作委员会Libexpat 1.95 或更高版本利比亚ml 0.1.4 或更高Erlang/OTP R15B 或更高版本。 OpenSSL 0.9.8 或更高版本,...

    Android使用smack连接ejabberd服务器注册、收发消息

    ejabberd是一个开源的XMPP服务器,它提供了稳定、安全且可扩展的服务,支持多种编程语言的客户端接口。Smack是Java和Android平台上常用的XMPP客户端库,它提供了丰富的API,使得开发者可以轻松地构建XMPP应用。 **...

    android+ejabberd

    IM(ejabberd)服务器的客户端android开发的代码详解,该代码例子包含单聊、群聊、发送文字、发送及接收文件等功能。

    Android IM开发 Ejabberd+asmck+spack

    本项目“Android IM开发 Ejabberd+asmck+spack”提供了一套完整的解决方案,包括服务器端、Android客户端以及PC端客户端。 **Ejabberd服务器** Ejabberd是一款开源的XMPP(Extensible Messaging and Presence ...

    iOS xmpp ejabberd服务器

    本文件主要关注的是如何在iOS平台上使用XMPP与ejabberd服务器进行集成,实现即时通讯功能。 ejabberd是一款开源的XMPP服务器,支持多种平台,包括iOS。它提供了强大的可扩展性和高可用性,能够处理大量的并发用户,...

    ejabberd_rest_client:面向ejabberd的REST客户端

    ejabberd_rest_client是与ejabberd服务器交互的一个客户端库,它利用ejabberd的API接口,通过RESTful方式来操作ejabberd服务器,实现了对ejabberd服务器的远程控制和数据管理。 ejabberd API是ejabberd服务器提供的...

    ejabberd-14.07聊天服务器

    ejabberd是一款高度可扩展且稳定可靠的XMPP聊天服务器,专为满足现代通信需求而设计。这款服务器在IT行业中广泛应用于构建实时通讯系统,尤其是针对手机端应用,如Android和iOS的聊天功能。ejabberd的强大在于其灵活...

    ejabberd 群聊 strophe.js 实现

    ejabberd是一款开源的XMPP服务器,常用于构建实时通信系统,如即时消息(IM)、群聊等。XMPP(Extensible Messaging and Presence Protocol)是一种基于XML的开放标准,用于实现即时通信和在线状态传输。在这个场景...

Global site tag (gtag.js) - Google Analytics