У меня есть работающий сервер Ejabberd (версия 2.1.9) и мое клиентское приложение работает нормально, но я хочу изменить способ подключения XMPP-клиента приложения к Ejabberd, чтобы уменьшить количество запросов/ответов между ними, потому что это для мобильная среда, и я хочу сократить начальное время соединения.
Я просмотрел спецификацию протокола XMPP (RFC 6120) и некоторые расширения протокола (XEP), а именно Быстрый запуск XEP-0305, но сам протокол не определяет вход с одним запросом и расширение Quickstart, хотя и направлено на сокращение количества запросов, недостаточно для сокращения времени, которое я ищу.
После поиска и не найдя никакого решения, я начал модифицировать как клиент, так и сервер и сейчас хочу выполнить следующее в качестве доказательства концепции:
//Client Request
<?xml version='1.0'?>
<stream:stream ... user='user' pass='pass'>
//Server Response
<?xml version='1.0'?>
<stream:stream ... success='1'>
Мне удалось соответствующим образом изменить мой клиент и сервер Ejabberd, и кажется, что они успешно подключаются, но любой запрос, который делает клиент после установления сеанса, не получает ответа от сервера. Я использовал Wireshark для проверки TCP-соединения на стороне клиента и сервера: на стороне клиента он открыт, и запрос отправляется, а на стороне сервера также открыт, и запрос получен, но когда я пытаюсь отправить ответ, это не так. послал.
Я изменил ТОЛЬКО файл ejabberd_c2s.erl, и изменения следующие:
//init function
...
%% changed the first state of the fsm to point to quickstart
%% {ok, wait_for_stream, #state{socket = Socket1,
{ok, wait_for_quickstart, #state{socket = Socket1,
...
//wait_for_quickstart function
...
case resource_conflict_action(U, StateData#state.server, R) of
closenew ->
send_header(StateData, Server, "1.0", DefaultLang, "0"),
send_trailer(StateData),
{stop, normal, StateData};
{accept_resource, R2} ->
JID = jlib:make_jid(U, StateData#state.server, R2),
allow = acl:match_rule(Server,c2s,JID),
case ejabberd_auth:check_password(U, Server, P) of
true ->
send_header(StateData, Server, "1.0", DefaultLang, "1"),
change_shaper(StateData, JID),
{Fs, Ts} = ejabberd_hooks:run_fold(
roster_get_subscription_lists,
StateData#state.server,
{[], []},
[U, StateData#state.server]),
LJID = jlib:jid_tolower(jlib:jid_remove_resource(JID)),
Fs1 = [LJID | Fs],
Ts1 = [LJID | Ts],
PrivList =
ejabberd_hooks:run_fold(
privacy_get_user_list,
StateData#state.server,
#userlist{},
[U, StateData#state.server]),
SID = {now(), self()},
Conn = get_conn_type(StateData),
Info = [{ip, StateData#state.ip},
{conn, Conn},
{auth_module, StateData#state.auth_module}],
ejabberd_sm:open_session(SID, U, StateData#state.server, R, Info),
NewStateData =
StateData#state{
user = U,
resource = R2,
jid = JID,
sid = SID,
conn = Conn,
auth_module = ejabberd_auth_internal,
authenticated = true,
pres_f = ?SETS:from_list(Fs1),
pres_t = ?SETS:from_list(Ts1),
privacy_list = PrivList},
fsm_next_state_pack(session_established,
NewStateData);
_ ->
%%auth fail
end
end.
Просто уточню: первоначальный запрос аутентификации клиента и ответ сервера передаются нормально, последующие запросы тоже передаются, но ответа на них нет.
Я что-то упускаю из виду?
заранее спасибо