Ejabberd抓住客户端断开连接

时间:2011-07-29 18:00:45

标签: erlang ejabberd exmpp

我运行用erlang / exmpp编写的ejabberd和bot。我连接到这个机器人一些jabber客户端。我怎样才能抓住客户端断开连接?

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

我真的不知道如果我理解你是对的,但是如果你有能力让客户端向机器人发送直接存在,那么当用户离线时,服务器会向机器人发送断开连接的通知

您可以在RFC 3921中找到一些文档 这是一个痘痘提取物。

  

5.1.4。定向存在

     

用户可以将定向存在发送给另一个实体(即,a   存在节带有'to'属性,其值是JID的   其他实体,没有'type'属性或'type'属性   其值为“不可用”)。有三种可能的情况:

     
      
  1. ...
  2.   
  3. 如果用户将定向在线状态发送给不在的实体   订阅类型为“from”或“both”之后的用户名单   已发送初始状态并且在发送不可用状态之前   广播,用户的服务器必须路由或提供完整的XML   存在节到entityv(...);但是,如果可用的话   用户发送定向存在的资源变为   不可用,用户的服务器必须广播不可用的   存在于实体(如果用户尚未发送指示   不存在该实体的存在)。
  4.   
  5. ...
  6.   

希望得到这个帮助。

答案 2 :(得分:0)

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