2015-03-13 2 views
0

У меня есть tcp-сокет для моего приложения. Поддержка TCP поддерживается в течение 10 секунд.tcp keep alive basic query

Кроме того, у меня также есть msgs, текущие между приложением и сервером каждые 1 сек, чтобы получить статус.

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

Теперь рассмотрим этот сценарий: удаленный сервер отключен, поэтому периодическая отправка сообщений (что происходит каждые 1 сек.) Прерывается 3-5 раз подряд. Я не думаю, что включив tcp keep alives, мы можем обнаружить, что сокет сломан, не так ли?

Нужно ли нам затем строить логику в нашем коде, чтобы гарантировать, что если этот периодический msg не будет выполняться определенное количество раз подряд, то другой конец должен считаться мертвым?

Дайте мне знать.

ответ

1

В вашем приложении не имеет смысла активировать поддержку. Держитесь в живых, для приложений, имеющих открытое соединение, и не используйте их все время, вы используете его все время, чтобы поддерживать жизнь не нужно. Когда вы отправляете что-то, а другой конец разбился, TCP на клиенте отправит все повторные передачи с увеличением таймаута. Наконец, если у вас есть блокирующий сокет, вы хорошо получите индикацию ошибки в операции отправки, когда знаете, что вам нужно закрыть сокет и повторить попытку подключения. Индикация ошибки - это код возврата операции сокета < 0. Я не знаю значения этих тайм-аутов наизусть, но это может занять до минуты или дольше. Когда сервер будет изящно выключен, то есть он закроет его отправку сокета, вы получите эту информацию, получив 0 байт на вашем приемном сокете.

Вы могли бы хотеть проверить мой ответ вчера, а также:

Reset TCP connection if server closes/crashes mid connection

0

Нет, вы не должны считать, что угодно. Соединение будет ломаться либо потому, что отправка будет тайм-аутом, либо останется в живых. В любом случае соединение сломается, и вы начнете получать ошибки при чтении и записи.