【发布时间】:2011-07-29 18:00:45
【问题描述】:
我运行用 erlang/exmpp 编写的 ejabberd 和 bot。我将一些 jabber 客户端连接到这个机器人。如何捕获客户端断开连接?
【问题讨论】:
我运行用 erlang/exmpp 编写的 ejabberd 和 bot。我将一些 jabber 客户端连接到这个机器人。如何捕获客户端断开连接?
【问题讨论】:
你说的捕捉是什么意思? 对于调试,在 ejabberd_sm:close_session 中添加 ?DEBUG。 用于通过 ejabberd_c2s:terminate 和相同的 ejabberd_sm:close_session 跟踪 dbg。 对于应用程序调用订阅 sm_remove_connection_hook。 也许实现自己的钩子并使用自定义的钩子?
【讨论】:
我真的不知道我是否理解正确,但如果你有能力让客户端向机器人发送定向存在,当用户离线时,服务器将向机器人发送断开连接的通知.
您可以在RFC 3921 中找到一些文档 这是一小段摘录。
5.1.4。定向存在
用户可以将定向出席信息发送给另一个实体(即, 具有“to”属性的存在节,其值为 其他实体并且没有“类型”属性或“类型”属性 其值为“不可用”)。有三种可能的情况:
- ...
- 如果用户向不在 订阅类型为“from”或“both”的用户名册 已发送初始出席信息且在发送不可用出席信息之前 广播,用户的服务器必须路由或传递完整的 XML 实体v(...)的存在节;但是,如果可用 用户发送定向出席信息的资源成为 不可用,用户的服务器必须广播不可用 存在于实体(如果用户尚未发送定向 该实体无法在场)。
- ...
希望对您有所帮助。
【讨论】:
我认为您正在尝试检查用户何时关闭 c2s 连接而不是检查用户何时发送离线节,您可以为此目的编辑和自定义 ejabberd_c2s.erl。在 ejabber_c2s 中,处理断开连接的函数是 terminate/3(第 1425 行),您可以很容易地找到客户端的 jabber id。
【讨论】: