【问题标题】:Ejabberd catch client disconnectEjabberd 捕获客户端断开连接
【发布时间】:2011-07-29 18:00:45
【问题描述】:

我运行用 erlang/exmpp 编写的 ejabberd 和 bot。我将一些 jabber 客户端连接到这个机器人。如何捕获客户端断开连接?

【问题讨论】:

    标签: erlang ejabberd exmpp


    【解决方案1】:

    你说的捕捉是什么意思? 对于调试,在 ejabberd_sm:close_session 中添加 ?DEBUG。 用于通过 ejabberd_c2s:terminate 和相同的 ejabberd_sm:close_session 跟踪 dbg。 对于应用程序调用订阅 sm_remove_connection_hook。 也许实现自己的钩子并使用自定义的钩子?

    【讨论】:

    • 客户端向bot发送消息,bot向客户端发送消息,然后客户端下线,我怎样才能抓住这个时刻并知道哪个客户端JID下线?
    【解决方案2】:

    我真的不知道我是否理解正确,但如果你有能力让客户端向机器人发送定向存在,当用户离线时,服务器将向机器人发送断开连接的通知.

    您可以在RFC 3921 中找到一些文档 这是一小段摘录。

    5.1.4。定向存在

    用户可以将定向出席信息发送给另一个实体(即, 具有“to”属性的存在节,其值为 其他实体并且没有“类型”属性或“类型”属性 其值为“不可用”)。有三种可能的情况:

    1. ...
    2. 如果用户向不在 订阅类型为“from”或“both”的用户名册 已发送初始出席信息且在发送不可用出席信息之前 广播,用户的服务器必须路由或传递完整的 XML 实体v(...)的存在节;但是,如果可用 用户发送定向出席信息的资源成为 不可用,用户的服务器必须广播不可用 存在于实体(如果用户尚未发送定向 该实体无法在场)。
    3. ...

    希望对您有所帮助。

    【讨论】:

      【解决方案3】:

      我认为您正在尝试检查用户何时关闭 c2s 连接而不是检查用户何时发送离线节,您可以为此目的编辑和自定义 ejabberd_c2s.erl。在 ejabber_c2s 中,处理断开连接的函数是 terminate/3(第 1425 行),您可以很容易地找到客户端的 jabber id。

      【讨论】:

        猜你喜欢
        • 2023-03-16
        • 2011-03-21
        • 1970-01-01
        • 2010-11-01
        • 1970-01-01
        • 2017-07-17
        • 2021-12-05
        相关资源
        最近更新 更多