zoukankan      html  css  js  c++  java
  • ejabberd_s2s

    作为gen_server启动

    初始化时创建s2s(mnesia)表,保存的是服务器之间的联系信息,server和server之间的路由

    主要为do_route(From, To, Packet)方法

    do_route(From, To, Packet) ->
        ?DEBUG("s2s manager~n	from ~p~n	to ~p~n	packet "
           "~P~n",
           [From, To, Packet, 8]),
        case find_connection(From, To) of
          {atomic, Pid} when is_pid(Pid) ->
          ?DEBUG("sending to process ~p~n", [Pid]),
          #xmlel{name = Name, attrs = Attrs, children = Els} =
              Packet,
          NewAttrs =
              jlib:replace_from_to_attrs(jid:to_string(From),
                         jid:to_string(To), Attrs),
          #jid{lserver = MyServer} = From,
          ejabberd_hooks:run(s2s_send_packet, MyServer,
                     [From, To, Packet]),
          send_element(Pid,
                   #xmlel{name = Name, attrs = NewAttrs, children = Els}),
          ok;
          {aborted, _Reason} ->
          case xml:get_tag_attr_s(<<"type">>, Packet) of
            <<"error">> -> ok;
            <<"result">> -> ok;
            _ ->
            Err = jlib:make_error_reply(Packet,
                            ?ERR_SERVICE_UNAVAILABLE),
            ejabberd_router:route(To, From, Err)
          end,
          false
        end.
    View Code

    首先根据from,to在s2s里面查找是否存在路由find_connection(From, To)

    如找到则返回存在的pid

    如果没找到则利用open_several_connections函数创建:

    启动一个ejabberd_s2s_out进程去建立连接,并把建立的信息和pid保存到s2s里面,方便下次路由用到

    其中ejabberd_s2s_out作为ejabberd_s2s_out_sup的子进程,连接到别的节点开启的ejabberd_s2s_in 服务(默认开启三个监听接口ejabberd_c2s、ejabberd_s2s_in、ejabberd_http)

  • 相关阅读:
    使用JS实现网页动态换肤
    数据库更新Sql脚本总结
    Javascript无刷新获取当前时间
    ASP.NET将网页设为桌面图标实现
    解决在IE浏览器中resize事件执行多次
    linux编译安装gcc5.3.0
    JAVA抽象类和接口
    JAVA内部类
    推测竞赛中测试集的正负比例
    Codeforces Round #742 (Div. 2) 题解
  • 原文地址:https://www.cnblogs.com/lawen/p/5052563.html
Copyright © 2011-2022 走看看