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