Данный пост ориентирован на разработчиков.
Ошибка проявляется на разных клиентах. По крайней мере, на этих: Pidgin, qutim 0.2, qutim sdk_0.3. Настораживает то, что есть зависимость от UIN.
Ошибка протекает следующим образом, клиент отправляет запрос на login-сервер, сервер в ответ присылает адрес BOSS-сервера, клиент устанавливает соединение с последним, происходит первичная инициализация соединения (если подробнее, то сервер и клиент отсылают друг другу FLAP на канал 1), сервер отсылает поддерживаемые сервисы, клиент отвечает. До этого момента все идет своим чередом, но дальше все... пусто... Сервер должен присылать пакеты, клиент их ждет. В итоге проходит тот 2-х минутный таймаут, и сервер, недождавшись финального пакета инициализации, отрубает нас.
У меня несколько подозрений, но все они не принимают во внимание зависимость от UIN.
1) Про логине к серверу клиент отправляет структуру данных:
- Code: Select all
struct ClientInfo
{
QByteArray id_string;
quint16 id_number;
quint16 major_version;
quint16 minor_version;
quint16 lesser_version;
quint16 build_number;
quint32 distribution_number;
QByteArray language;
QByteArray country;
};
Возможно она ошибочна в qutim 0.2 (точнее стала ошибочна после очередных изменений на сервере).
2) Структура ClientInfo отправляется два раза, при присоединении к логин-серверу и при присоединении к BOSS-серверу. Зная это, можно предположить, что отравляются две разные структуры, и последнее перестал переваривать сервер.
3) Каждый пакет Oscar, называемый FLAP, имеет порядковый номер. Возможно, как это уже было при прошлой серьезной борьбе с альтернативными клиентам, сервер каким-то образом проверяет этот номер у первого пришедшего FLAP.
4) На сервере объявили SNAC(0x0001, 0x0018) устаревшим. Если не ошибаюсь, то именно на нем происходит "затык". SNAC –
пакеты более высокого уровня, чем FLAP, которые используются на втором канале соединения.