我对此进行了一些挖掘,这就是交易。您从中获得的价值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 对你有什么好处。特别是,我不确定在这种情况下“离线”和“断开连接”之间的区别是什么。但无论如何,这就是你获取信息的方式。