Извлечение SID с использованием SID PID и JID - PullRequest
1 голос
/ 06 сентября 2011

Я пытаюсь найти способ извлечь SID сеанса bosh (ejabberd), используя PID и JID, чтобы я мог использовать его в ejabberd_sm:unset_presence, я искал везде, но не могу найти способ сделать это.

По сути, я построил систему чата с использованием Ejabberd и Strophe, и я пытаюсь добиться этого, когда пользователь нажимает кнопку автономного режима на одной странице, и все сеансы, связанные с этим JID, должны отключаться.PID с помощью ejabberd_sm:get_session_pid, но не может найти способ извлечь SID.Я также попробовал SID ! Disconnect, но это полностью отключает пользователя, чего я не хочу.

Если кто-то проделал такую ​​работу, пожалуйста, помогите мне, другие идеи для реализации такой вещи также приветствуются.

Спасибо

1 Ответ

0 голосов
/ 07 сентября 2011

Я немного покопался в этом, и вот сделка.Значение, которое вы получаете от ejabberd_sm:get_session_pid, является процессом ejabberd_c2s для сеанса этого пользователя.Но ejabberd_c2s совершенно не знает о BOSH.Что вам действительно нужно, так это идентификатор сеанса BOSH пользователя, который поддерживается модулем 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 действительно будет вам полезен.И, в частности, я не уверен, в чем разница между «отключением» и «отключением» в этом сценарии.Но в любом случае, именно так вы получаете информацию.

...