Добрый день.
У нас на работе с коллегой возник спор по поводу keep alive TCP соединения с клиентом.
Я утверждаю:
Метод
Stream.Read (Byte[], Int32, Int32)
Read возвращает 0 только в том случае, если нет дополнительных данных в потоке и больше не ожидаются (например, сокет закрыт или достигнут конец файла)
(копия примечания с msdn: https://msdn.microsoft.com/ru-ru/library/system.io.stream.read(v=vs.110).aspx)
Т.е. если мы выполняем await ReadAsync и постоянно получаем 0 байт, следовательно TCP клиент отвалился. Данный метод "keep alive" актуален при использовании ReadAsync и корректном дисконнекте клиента (чтобы на уровне TCP успел придти пакет о закрытии сокета).
Мой коллега утверждает:
Нельзя пологаться на этот метод. Единственный способ "keep alive" - это послать "heart bit" и удостовериться, что на том конце есть кому его принимать, иначе TCP клиент отвалился.
Хотелось бы узнать что думаете вы??
Нет смысла "постоянно получать 0 байт", первый же 0 означает закрытый на чтение сокет.
Однако, закрытым соединение становится только после прихода FIN или RST-пакета, причем пакет RST еще и имеет негарантированную доставку! Поэтому, если вас не устраивает системный тайм-аут в 2 часа для Keep-Alive (который к тому же по умолчанию для сокетов выключен) - обязательно нужно писать свою логику определения зависших соединений.
Тем не менее, не обязательно для этого отправлять heartbeat-сообщения. Если протокол подразумевает возможность повторного подключения - можно просто выставить тайм-аут на чтение и после тайм-аута закрывать соединение.
С другой стороны, надо помнить о NAT. Многие реализации PNAT имеют свои тайм-ауты для исходящих соединений - и могут разорвать неактивное соединение. Этот тайм-аут может быть очень небольшим, и угадать его заранее нельзя. Если важно чтобы соединение не рвалось само по себе - придется вводить в протокол клиентские keep-alive сообщения, с настраиваемым интервалом.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
У VK API есть ограничение - 3 запроса в секундуКак используя javascript sdk, ограничить запросы до трех в секунду?
Доброго времени сутокЗнаю что хочу не возможного, просто хочу убедится, действительно ли это так, пишу сюда т
Хотелось бы узнать о различиях между методом ({method(){}}) и функцией ({function: function(){}}) - как по смыслу, так и техническиЖелательно не выдержку из спеки...