Тайм-аут сокета случайным образом срабатывает быстрее, чем должен - PullRequest
0 голосов
/ 30 октября 2018

У меня есть приложение, которое обменивается данными со встроенным устройством, используя пользовательский протокол, созданный поверх udp. Чтобы убедиться, что устройство все еще находится в сети, у меня есть принимающая сторона гнезда дейтаграммы с таймаутом в 1 секунду. Если тайм-аут срабатывает, я отправляю эхо-запрос на встроенное устройство и жду еще секунду (если это происходит дважды, я предполагаю, что дальнейшая связь невозможна, и изменяю внутреннее состояние приложения на отключенное).

При тестировании приложения было замечено, что приложение внезапно переключится в отключенное состояние (это может происходить в любом месте от 5 минут до 2,5 часов работы). На встроенном устройстве не было ошибок, и tcpdump показывает, что встроенное устройство ответило в течение 30 мс. tcpdump также показывает, что окончательный набор эхо-запросов был отправлен на сервер менее чем за 10 мс

отображение данных tcpdump с помощью wireshark

Я не знаю, какова вероятность того, что системные часы внезапно перейдут во времени, но это то, что выглядит как происходящее.

Да, и это было проверено на следующих устройствах:

  • Пиксель 2
  • Sumsung S9
  • Основной телефон
  • Старое устройство LG
  • Samsung Galexy Tab 3

Эта проблема была задокументирована только на вкладке Galaxy

Кто-нибудь еще заметил проблемы с синхронизацией с этим или другими устройствами, где событие будет срабатывать раньше? В частности, где системные часы сообщат, что прошло больше времени, чем на самом деле? Если так, какие-либо предложения о том, как я могу уменьшить это? Если нет, кто-нибудь знает, что еще может быть причиной этих симптомов?

Журналы времени от слушателя udp с использованием SystemClock.elaspedRealtime() и SystemClock.uptimeMillis():

pre recieve: elapsedRealtime: 191128173 uptimemillis: 106498062
pre recieve: elapsedRealtime: 191129199 uptimemillis: 106499088
pre recieve: elapsedRealtime: 191130224 uptimemillis: 106500113
pre recieve: elapsedRealtime: 191131252 uptimemillis: 106501141
pre recieve: elapsedRealtime: 191132278 uptimemillis: 106502167
pre recieve: elapsedRealtime: 191133301 uptimemillis: 106503190
pre recieve: elapsedRealtime: 191134325 uptimemillis: 106504214
pre recieve: elapsedRealtime: 191135350 uptimemillis: 106505239
pre recieve: elapsedRealtime: 191136376 uptimemillis: 106506265
pre recieve: elapsedRealtime: 191137400 uptimemillis: 106507289
post timeout: elapsedRealtime: 191138404 uptimemillis: 106508293
pre recieve: elapsedRealtime: 191138406 uptimemillis: 106508295
post timeout: elapsedRealtime: 191139409 uptimemillis: 106509298
...