Bombus - mobile Jabber client (J2ME)

Bombus - mobile Jabber client

Sources: http://bombus-im.org/wiki/bombus/svn

!!! ВНИМАНИЕ !!! Убедительная просьба перед занесением багрепорта ознакомиться с правилами. Правильно оформленный отчёт об ошибке - залог быстрого её исправления. Спасибо!

Задачи

FS#827 — Не выполняется вход на сервер после reconnect'а

Присоединено проекту — Bombus - mobile Jabber client (J2ME)
Открыто Alex Mogilnikov (alx) - Sunday, 27 January 2008, 22:36 GMT+1
Тип задачи Ошибка
Категория Основные функции
Статус Назначено
Назначено Eugene (EvgS)
ОС Все платформы
Важность Низкая
Приоритет Нормальный
Обнаружено в версии 0.2-Stable
Ожидается в версии Не решено
Срок Не решено
Завершённость 0%
Голоса 0
Приватная задача Нет

Подробности

Bombus-0.5.1244 на Motorola L2 Исходное состояние: подключен. keep-alive: посылка пробела каждые 180 секунд. Таймаут GPRS: 15 минут.

Что было сделано - не делалось ничего, наблюдал за состоянием контактов. Пару раз приостанавливал на непродолжительное время (меньше минуты).

Что произошло: вот лог tcpdump’а с моими пояснениями:

22:57:17.934071 IP 89.20.97.73.28891 > xx.xx.xx.xx.5222: . 886:887(1) ack 9956 win 10976 <eol>
22:57:18.032481 IP xx.xx.xx.xx.5222 > 89.20.97.73.28891: . ack 887 win 65535
23:00:18.054287 IP 89.20.97.73.28891 > xx.xx.xx.xx.5222: . 887:888(1) ack 9956 win 10976 <eol>
23:00:18.146697 IP xx.xx.xx.xx.5222 > 89.20.97.73.28891: . ack 888 win 65535
23:02:08.143837 IP xx.xx.xx.xx.5222 > 89.20.97.73.28891: P 9956:10441(485) ack 888 win 65535
23:02:10.645496 IP 89.20.97.73.28891 > xx.xx.xx.xx.5222: . ack 10441 win 10976 <eol>
23:03:17.776500 IP 89.20.97.73.28891 > xx.xx.xx.xx.5222: . 888:889(1) ack 10441 win 10976 <eol>
23:03:17.870924 IP xx.xx.xx.xx.5222 > 89.20.97.73.28891: . ack 889 win 65535

До этого места все спокойно, серверу каждые 3 минуты шлется пробел, от сервера иногда принимается <presence/>. Предположительно в это время пропала связь (была попытка сделать звонок, получено сообщение “сеть занята”, но все быстро пришло в норму).

23:05:48.118118 IP 89.20.97.157.55056 > xx.xx.xx.xx.5222: S 3120156857:3120156857(0) win 10976 <mss
23:05:48.118556 IP xx.xx.xx.xx.5222 > 89.20.97.157.55056: S 3748625302:3748625302(0) ack 3120156858
23:05:51.116075 IP xx.xx.xx.xx.5222 > 89.20.97.157.55056: S 3748625302:3748625302(0) ack 3120156858
23:05:56.678309 IP 89.20.97.157.55056 > xx.xx.xx.xx.5222: S 3120156857:3120156857(0) win 10976 <mss
23:05:56.678699 IP xx.xx.xx.xx.5222 > 89.20.97.157.55056: S 3748625302:3748625302(0) ack 3120156858
23:05:56.907626 IP 89.20.97.157.55056 > xx.xx.xx.xx.5222: . ack 1 win 10976 <eol>
23:05:57.138968 IP 89.20.97.157.55056 > xx.xx.xx.xx.5222: . ack 1 win 10976 <eol>

Bombus установил новое tcp соединение.

23:06:17.859032 IP 89.20.97.157.55056 > xx.xx.xx.xx.5222: . 1:2(1) ack 1 win 10976 <eol>
23:06:17.955164 IP xx.xx.xx.xx.5222 > 89.20.97.157.55056: . ack 2 win 65535

И начал посылать keep-alive пробел в новое соединение, как будто ничего не произошло.

23:08:40.680822 IP xx.xx.xx.xx.5222 > 89.20.97.73.28891: P 10441:10442(1) ack 889 win 65535
23:08:51.510225 IP xx.xx.xx.xx.5222 > 89.20.97.73.28891: P 10441:10442(1) ack 889 win 65535
23:09:12.969605 IP xx.xx.xx.xx.5222 > 89.20.97.73.28891: P 10441:10443(2) ack 889 win 65535

Сервер обнаруживает смерть старого соединения и по таймауту его разрывает.

23:09:17.821086 IP 89.20.97.157.55056 > xx.xx.xx.xx.5222: . 2:3(1) ack 1 win 10976 <eol>
23:09:17.919383 IP xx.xx.xx.xx.5222 > 89.20.97.157.55056: . ack 3 win 65535

А новое соединение остается в начальной стадии произвольно долгое время: сервер считает, что Bombus отключен, а Bombus думает, что он в сети.

Теперь при попытке что-либо отправить с телефона, например <presence/>, сервер резонно отвечает stream:error bad-format и рвет новое соединение.

Bombus несколько секунд отображает на дисплее сообщение “be Stream error: undefined condition” и остается в состоянии offline.

Что ожидалось:

1. После разрыва соединения bombus должен был сбросить состояние в offline и после установки нового tcp соединения заново открывать xml поток, выполнять аутентификацию и т.д.

2. После получения ошибки и закрытия соединения со стороны сервера не оставаться в оффлайне, а пробовать заново с ним соединиться. А то обидно - Bombus отключился, а я ношу телефон в кармане и об этом даже не знаю...

Задача зависит от

Комментарий от Alex Mogilnikov (alx) - Sunday, 27 January 2008, 22:59 GMT+1

Да, забыл добавить: п. 1, очевидно, лечится установкой в настройках соединения типа keep-alive в <iq/> вместо 1 байт, но это мало что даст, если в результате сервер сругается и разорвет соединение, а Bombus так и останется в оффлайне.

Комментарий от Alex Mogilnikov (alx) - Monday, 28 January 2008, 11:42 GMT+1

Я несколько поторопился с предыдущим предположением. Как оказалось, использование <iq/> в качестве keep-alive пакета не помогает. При пропадании связи с сервером Bombus продолжает считать, что он online (по крайней мере, через час после пропадания связи он по-прежнему показывал собственное состояние как “доступен”, и отображал состояние контактов, каким оно было на момент потери связи. Желая выполнить переподключение к серверу, командую “Состояние - отключен”. Никакого эффекта нет, значок состояния по-прежнему показывает “доступен”. Снова командую “Состояние - отключен”. Значок состояния теперь показывает “отключен”, но состояние контактов не меняется, соединение с сервером не устанавливается. Тогда командую “меню - account - подкл...”, получаю зависание - Bombus не реагирует на клавиши, подключения нет. Командую “приостановить приложение”, затем “возобновить приложение”. Получаю белый экран с надписью “Подождите” внизу. Реакции на кнопки нет, подключения тоже. Похоже, что отсутствие реакции на разрыв соединения - более серьезный баг, чем я предполагал ранее.

Комментарий от Eugene (EvgS) - Saturday, 16 February 2008, 19:02 GMT+1

пока что активная проверка состояния соединения бомбусом производится при типе keep-alive - version-ping

Загрузка...