我做了一些挖掘和這裏的交易。您從ejabberd_sm:get_session_pid
獲取的值是該用戶會話的ejabberd_c2s
進程。但ejabberd_c2s
完全不知道BOSH。您真正需要的是用戶的BOSH會話ID,它由模塊ejabberd_http_bind
維護。
盡我所能說,沒有「好」的方法從ejabberd_c2s
中獲取這些信息。最後我做這樣的事情:
St = sys:get_status(Pid),
State = lists:nth(3, lists:nth(5, element(4, St))),
SocketState = element(2, State),
BindPid = element(2, element(3, SocketState)),
現在,這一切,讓你在一天結束的是PID爲ejabberd_http_bind
過程。您可以再次重複整個骯髒的生意,但在這裏我建議作弊一點:
MS = ets:fun2ms(fun(#http_bind{pid=BP, id=Id}) when BP == BindPid -> Id end),
mnesia:dirty_select(http_bind, MS).
正如你所看到的,這是窘況醜陋。更好的方法是修改ejabberd_c2s
以接受將返回套接字信息的新類型sync_event
,並同樣修改ejabberd_http_bind
以接受類似類型的事件以返回SID。當然,這些都將被包裝在內部進行相關gen_fsm
調用的公共功能中。
說了這麼多,我不確定BOSH SID真的會對你有什麼好處。特別是,我不確定在這種情況下「脫機」和「斷開」之間有什麼區別。但無論如何,這就是你如何獲得信息。
來源
2011-09-07 03:47:01
Dan
感謝您的信息Dan,我在我的問題中解釋了爲什麼我需要SID,爲了使用戶「離線」強制需要,Disconnect將關閉我不想要的連接,我希望他們停留在連接上但顯示爲脫機狀態。 – TilalHusain
毫無疑問,這只是一個演示,而且太粗糙,不適合在真實代碼中使用。相反,你應該從被記錄的'element(4,St)'開始,然後在列表中進行模式匹配以找到另一個以進程ID開頭的列表的元素,然後在*列表中找到另一個模式匹配與來自'ejabberd_c2s'的'state'記錄相匹配的元素等等。 – Dan
這種方法變得相當困難,而是我將所有的SID記錄在mnesia表中,並將其用於我的目的。感謝所有的幫助。 – TilalHusain