Bombus - mobile Jabber client
Sources: http://bombus-im.org/wiki/bombus/svn
!!! ВНИМАНИЕ !!! Убедительная просьба перед занесением багрепорта ознакомиться с правилами. Правильно оформленный отчёт об ошибке - залог быстрого её исправления. Спасибо!
FS#827 — Не выполняется вход на сервер после reconnect'а
Открыто Alex Mogilnikov (alx) - Sunday, 27 January 2008, 22:36 GMT+2
|
Подробности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 отключился, а я ношу телефон в кармане и об этом даже не знаю... |
Да, забыл добавить: п. 1, очевидно, лечится установкой в настройках соединения типа keep-alive в <iq/> вместо 1 байт, но это мало что даст, если в результате сервер сругается и разорвет соединение, а Bombus так и останется в оффлайне.
Я несколько поторопился с предыдущим предположением. Как оказалось, использование <iq/> в качестве keep-alive пакета не помогает. При пропадании связи с сервером Bombus продолжает считать, что он online (по крайней мере, через час после пропадания связи он по-прежнему показывал собственное состояние как “доступен”, и отображал состояние контактов, каким оно было на момент потери связи. Желая выполнить переподключение к серверу, командую “Состояние - отключен”. Никакого эффекта нет, значок состояния по-прежнему показывает “доступен”. Снова командую “Состояние - отключен”. Значок состояния теперь показывает “отключен”, но состояние контактов не меняется, соединение с сервером не устанавливается. Тогда командую “меню - account - подкл...”, получаю зависание - Bombus не реагирует на клавиши, подключения нет. Командую “приостановить приложение”, затем “возобновить приложение”. Получаю белый экран с надписью “Подождите” внизу. Реакции на кнопки нет, подключения тоже. Похоже, что отсутствие реакции на разрыв соединения - более серьезный баг, чем я предполагал ранее.
пока что активная проверка состояния соединения бомбусом производится при типе keep-alive - version-ping