1

我正在尝试找到一种使用 PID 和 JID 提取 bosh 会话(ejabberd)的 SID 的方法,以便我可以在其中使用它ejabberd_sm:unset_presence,我到处搜索但找不到方法。

基本上,我已经使用 Ejabberd 和 Strophe 构建了一个聊天系统,我想要实现的是当用户按下一个页面上的脱机按钮时,与该 JID 关联的所有会话都需要脱机,我已经通过使用提取了 PID,ejabberd_sm:get_session_pid但可以'找不到提取 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以接受将返回套接字信息的新类型sync_event,并同样修改ejabberd_http_bind以接受类似类型的事件以返回 SID。当然,这两者都将被包装在内部进行相关gen_fsm调用的公共函数中。

综上所述,我不确定 BOSH SID 对你有什么好处。特别是,我不确定在这种情况下“离线”和“断开连接”之间的区别是什么。但无论如何,这就是你获取信息的方式。

于 2011-09-07T03:47:01.977 回答