0

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

4

3 回答 3

2

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

于 2011-07-29T18:45:00.240 回答
1

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

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

5.1.4。定向存在

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

  1. ...
  2. 如果用户在发送初始出席信息后和发送不可用出席信息广播之前,向不在用户名册中的实体发送定向出席信息,订阅类型为“from”或“both”,则用户的服务器必须路由或传递完整的 XML实体v(...)的那个存在节;然而,如果用户发送定向出席信息的可用资源变得不可用,用户的服务器必须向实体广播该不可用出席信息(如果用户尚未向该实体发送定向不可用出席信息)。
  3. ...

希望这有帮助。

于 2011-07-31T23:03:06.937 回答
0

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

于 2011-09-14T10:31:19.593 回答