1

で使用できるように、PID と JID を使用して bosh セッション (ejabberd) の SID を抽出する方法を見つけようとしてejabberd_sm:unset_presenceいます。どこでも検索しましたが、それを行う方法が見つかりません。

基本的に、私は Ejabberd と Strophe を使用してチャット システムを構築しました。私が達成しようとしているのは、ユーザーが 1 つのページでオフライン ボタンを押したときに、その JID に関連付けられているすべてのセッションをオフラインにする必要があるというejabberd_sm:get_session_pidことです。 t SID を抽出する方法を見つけます。私も試しSID ! Disconnectましたが、それは私が望まないユーザーを完全に切断します。

誰かがこの種の作業を行った場合は、私を助けてください。そのようなことを実装するための他のアイデアも大歓迎です。

ありがとう

4

1 に答える 1

0

私はこれについていくつか掘り下げましたが、これが取引です。返される値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_eventejabberd_http_bindgen_fsm

とはいえ、BOSH SID が実際にどのような効果をもたらすかはわかりません。特に、このシナリオでは、「オフラインにする」と「切断する」の違いが何であるかわかりません。とにかく、それはあなたが情報を得る方法です。

于 2011-09-07T03:47:01.977 に答える