私はこれについていくつか掘り下げましたが、これが取引です。返される値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)),
さて、一日の終わりに得られるのは、ejabberd_http_bind
プロセスの PID だけです。あなたは再び卑劣なビジネス全体を繰り返すことができますが、ここでは少しごまかすことをお勧めします:
MS = ets:fun2ms(fun(#http_bind{pid=BP, id=Id}) when BP == BindPid -> Id end),
mnesia:dirty_select(http_bind, MS).
ご覧のとおり、これはひどく醜いです。より良い方法は、ソケット情報を返すejabberd_c2s
新しいタイプの を受け入れるように変更し、同様に、SID を返す同様の種類のイベントを受け入れるように変更することです。そしてもちろん、これらは両方とも、関連する呼び出しを内部的に行うパブリック関数にラップされます。sync_event
ejabberd_http_bind
gen_fsm
とはいえ、BOSH SID が実際にどのような効果をもたらすかはわかりません。特に、このシナリオでは、「オフラインにする」と「切断する」の違いが何であるかわかりません。とにかく、それはあなたが情報を得る方法です。