2011-07-29 157 views
0

我跑ejabberd和殭屍Erlang編寫/ exmpp。我連接到這個bot一些jabber客戶端。我如何捕捉客戶端斷開連接?Ejabberd抓客戶端斷開

回答

2

你的意思是抓什麼? 用於調試add?DEBUG in ejabberd_sm:close_session。 用於跟蹤ejabberd_c2s上的dbg:終止和相同的ejabberd_sm:close_session。 對於應用程序調用訂閱sm_remove_connection_hook。 也許實現你自己的鉤子並使用自定義的一個?

+0

客戶端發送信息給機器人和機器人將消息發送到客戶端,然後客戶端進入離線,我怎麼能抓住這個時刻,知道客戶JID離線哪去了? – 0xAX

1

我真的不知道如果我理解你是正確的,但是如果你有權力讓客戶端向機器人發送指示狀態,當用戶離線時,服務器會發送斷開連接的通知給機器人。

你可以在RFC 3921 找到一些文件這裏有一個litle摘錄。

5.1.4。針對存在

用戶可以發送針對存在於另一實體(即, 存在節與a「到」屬性,其值是 其他實體的JID,並用無「type」屬性或「型'屬性 ,其值「不可用」)。有三種可能的情況:

  1. ...
  2. 如果用戶發送指示存在,是不是在 「既」 後具有用戶與訂閱類型「從」或名冊實體發送初始的存在和發送不可用存在 廣播,用戶的服務器必須路線或之前交付的 完整的XML是存在節到entityv(...);然而,如果用戶發送定向呈現的可用 資源變得不可用,則用戶的服務器必須向該實體廣播該不可用的 呈現(如果用戶還沒有發送指示 不可用呈現給該實體)。
  3. ...

希望這有助於。

0

我想你嘗試檢查時,用戶關閉C2S連接,而不是檢查時用戶發送脫機節,您可以編輯和定製ejabberd_c2s.erl用於這一目的。在ejabber_c2s裏面,處理disconnect的函數是terminate/3(line#1425),你可以很容易地找到客戶端的jabber id。