Отключение интернет

Страницы: 1
RSS
Отключение интернет, Поведение программы при отключении интернет
 
Сегодня обнаружил такую штуку.

При выдергивании шнура интернет из роутера, квик сообщает о разрыве связи спустя 30-40 сек. Хотя данные перестают поступать сразу.

Как то не слишком медленное уведомление?

За это время можно набрать трейдера брокера и закрыть позиции например, но нет надо подождать 30-40 секунд.
Мягко говоря кажется это не совсем правильное поведение, как это объясняется логически?
                       
 
Цитата
Евгений написал:
надо подождать 30-40 секунд
Сокет не может отличить потерю пакета (что обычное явление) от обрыва линии, только по таймауту. В соединениях есть настроечка проверять связь с сервером, посылая пакет  каждые (60 по умолчанию) секунд. Вот можно попробовать уменьшить. Но без фанатизма,  не надо сервер дудосить.
 
Там ограничение минимум в 30 секунд, если меньше кнопка сохранить просто не активна, так что дудосить никак не получится.
Для скрипта можно отдельно пинговать или по времени последней записи из информационного окна.
                       
 
Цитата
Anton написал:
Сокет не может отличить потерю пакета (что обычное явление) от обрыва линии, только по таймауту.
Такой вопрос: при попытке установить соединение с сервером, если сервер ничего не отвечает (т.е., сервер жив, но на запросы буквально ничего не отвечает), то клиент будет висеть в состоянии установления связи с сервером бесконечно долго. Так тоже можно?
Не является ли это дурным тоном в программировании? Может, правильно будет по таймауту прекратить попытку соединения, и выдать соответствующее сообщение пользователю?
Надо делать так, как надо. А как не надо - делать не надо.
 
-- Пинг через cmd

local ip = "77.88.21.11" -- яндекс
ping = os.execute("ping -l 1 -n 1 "..ip)
посылает серверу 1 пакет если связь есть, true иначе false
                       
 
Цитата
Евгений написал:
-- Пинг через cmd

но ведь у этого способа тоже задержка на тайм-аут.
 
Сравнивая время сервера из информационного окна и время последней записи (перевести в number), и если время записи отстает от времени сервера, то проверять.
                       
 
При выдергивании шнура из роутера показывает моментально
                       
 
Цитата
Старатель написал:
Не является ли это дурным тоном в программировании? Может, правильно будет по таймауту прекратить попытку соединения, и выдать соответствующее сообщение пользователю?
Упс, прошу прощения, пропустил. Да, надо переводить сокет в неблокирующий режим и вызывать connect с отменой по таймауту, это если мы про вообще говорим. А если про квик, это скорей к арке вопрос.
 
Цитата
Anton написал:
Да, надо переводить сокет в неблокирующий режим и вызывать connect с отменой по таймауту

С таймаутом на что?
На конект - так он и так есть. Не подключилось - об этом сообщается через вполне разумный тайм-аут.
Но если подключилось, но "сервер не шлёт ничего" (или в проводах теряется? как вы отличаете?) - то тут что? Может там и не должно ничего приезжать, как догадаться? какой таймаут установить и на что?
 
Цитата
swerg написал:
Не подключилось - об этом сообщается
Это, когда пришёл ответ, что сервер не найден по указанному адресу или другая ошибка подключения.
А если ответа никакого нет (мож, пакет потерялся, мож ещё чё), то клиент так и будет ждать у моря погоды... И тайм-аутом там не пахнет.
Надо делать так, как надо. А как не надо - делать не надо.
 
Цитата
swerg написал:
На конект - так он и так есть.
Ящитаю, лучше этот вопрос порешать в коде, дабы не повиснуть навсегда, ежли юзер чего-нибудь в реестре наворотил (а там есть чего). Лучшие собаководы так делают и нам не грех.

Цитата
swerg написал:
Но если подключилось, но "сервер не шлёт ничего" (или в проводах теряется? как вы отличаете?) - то тут что? Может там и не должно ничего приезжать, как догадаться?
Ну тут путаница. Должен ли сервер что-то слать - протоколом определяется. По http не должен без запроса, а по фиксу, например, должен heartbit посылать, и если не пришло вовремя, надо фейлить. Простейший вариант - поставить таймаут на recv. Да и по http он нужен, если сокет синхронный. На асинхронном мы просто сами таймауты считаем, ставить через сокопт не нужно. Кстати говоря, когда что-то выкачиваешь большое с http в несколько потоков, сервера иногда за дудос принимают и начинают динамить, коннект принимают и держат его. Без таймаутов сокет виснет навсегда, ну или по крайней мере слишком надолго.


Цитата
Старатель написал:
что сервер не найден по указанному адресу
Это все ж от dns ошибка.
 
Цитата
Старатель написал:
А если ответа никакого нет (мож, пакет потерялся, мож ещё чё), то клиент так и будет ждать у моря погоды... И тайм-аутом там не пахнет.

Цитата
Евгений написал:
При выдергивании шнура интернет из роутера, квик сообщает о разрыве связи спустя 30-40 сек.

Во-первых, противоречащие параграфы. Ну если вы вообще про эту ситуацию говорите, а то не понятно.

Во-вторых, еще раз задам свой вопрос: вот потерялись пакеты, и? что вы предлагаете? Как понять они потерялись или серверу нечего отправить?
А никак. Только по тайм-ауту.
Можно обсуждать его величину, однако видно, что
а) тайм-аут имеет место быть
б) делать его длительностью в одну секунду - весьма много весомых противопоказаний есть против такого подхода.
 
Цитата
swerg написал:
Цитата
Anton написал:
Да, надо переводить сокет в неблокирующий режим и вызывать connect с отменой по таймауту
С таймаутом на что?

Anton отвечал на этот вопрос:
Цитата
Старатель написал:
при попытке установить соединение с сервером, если сервер ничего не отвечает (т.е., сервер жив, но на запросы буквально ничего не отвечает), то клиент будет висеть в состоянии установления связи с сервером бесконечно долго.
Надо делать так, как надо. А как не надо - делать не надо.
 
Цитата
swerg написал:
б) делать его длительностью в одну секунду - весьма много весомых противопоказаний есть против такого подхода.
У меня стоит 5 секунд, если больше просто идет запрос на связь, если есть хорошо работаем дальше, если нет остановка а там уже и квик на подходе если не подключится раньше
                       
Страницы: 1
Читают тему
Наверх