Отличить дисконнект от таймаута чтения

Cobalt747
Дата: 08.07.2019 22:50:57
Есть TCP-сервер
Клиент подключается и ждет команд от него.

иногда команды могут приходить очень редко.
Соответственно, при дисконнекте, когда связь рвется физически, никакого отличия от ошибки по таймауту я не наблюдаю.
И в списке портов это соединение также висит в статусе "Established"

Что посоветуете?
Dimitry Sibiryakov
Дата: 09.07.2019 00:28:12

Cobalt747
Что посоветуете?

Добавить в прикладной протокол PING-пакет, посылаемый при отсутствии другой активности в
течении ХХ секунд.

Posted via ActualForum NNTP Server 1.5

Gator
Дата: 09.07.2019 01:41:43
А может и таймаутом поиграть. Пинг-то он всеяден пр портам...

А дисконнект это что? Пьяный тракторист кабло распахал? Лавина/наводнение/миру кирдых?
При отдыхе, сервак по идее должен команду разослать типа BYE, "ушла на базу", "спать ложусь до NN:mm" ...
А кто прочухал, тот сам себе злобный клиентурко
istrebitel
Дата: 09.07.2019 06:58:45
Дегтярев Евгений
Дата: 09.07.2019 07:41:27
Gator
А может и таймаутом поиграть. Пинг-то он всеяден пр портам...

herfkbwj
black-manatee
Дата: 09.07.2019 07:49:13
Cobalt747
Есть TCP-сервер
Клиент подключается и ждет команд от него.


Что-то тут не так. Обычно клиент посылает команды серверу.

Речь идет про Indy ? Клиент устанавливает соединение с сервером и висит, ждет команды ?

Лучше, если клиент будет раз в X секунд открывать соединение с сервером, спрашивать: "Есть чо ?" и закрывать сразу соединение.
Дегтярев Евгений
Дата: 09.07.2019 07:56:45
Cobalt747,

Dimitry Sibiryakov дело говорит

гарантированный способ определить жив коннект или нет - записать что-то в сокет
если клиент не проявляет активности, ее нужно эмулировать - вводить в протокол сообщения ping и pong
клиент с интервалом, который на 10-20% меньше таймаута чтения, шлет пинг (если здесь ошибка коннект точно сдох), сервер должен ответить pong, если все ок, то клиент примет это сообщение и не будет таймаута по чтению, если же таймаут превышен - либо проблемы с коннектом либо с сервером
Дегтярев Евгений
Дата: 09.07.2019 08:10:27
black-manatee
Лучше, если клиент будет раз в X секунд открывать соединение с сервером, спрашивать: "Есть чо ?" и закрывать сразу соединение.

менее эффективно, особенно, если tls, особенно если большой rtt, но применимо если команды "тяжелые" и времени на обработку надо в разы больше чем на установку соединения.
kealon(Ruslan)
Дата: 09.07.2019 09:25:53
Cobalt747
Есть TCP-сервер
Клиент подключается и ждет команд от него.

иногда команды могут приходить очень редко.
Соответственно, при дисконнекте, когда связь рвется физически, никакого отличия от ошибки по таймауту я не наблюдаю.
И в списке портов это соединение также висит в статусе "Established"

Что посоветуете?
+1, стандартное решение
Cobalt747
Дата: 09.07.2019 11:10:19
Dimitry Sibiryakov
Cobalt747
Что посоветуете?

Добавить в прикладной протокол PING-пакет, посылаемый при отсутствии другой активности в
течении ХХ секунд.

Это было бы хорошо, конечно.
Но надо как-то выкрутиться в текущем положении.