Соединение сокета TCP имеет “поддержание”?

Будьте осторожны при доступе к DateTime. Теперь дважды, поскольку для вызовов возможно колебаться между полуночью, и Вы получите дурацкие результаты в редких случаях и будете оставлены, царапая Вашу голову.

Для сейфа необходимо присвоить DateTime. Теперь к локальной переменной сначала, если Вы собираетесь использовать его несколько раз:

var now = DateTime.Now;
var time = now.ToString("hh:mm:ss tt");
var date = now.ToString("MM/dd/yy");

Примечание использование нижнего регистра "гд" действительно отображает часы от 00-11 даже днем, и "tt" для показа/PM как вопрос, который требуют. Если Вы хотите 24-часовые часы 00-23, используйте "HH".

77
задан Cory Klein 25 November 2015 в 17:52
поделиться

4 ответа

TCP-сокеты остаются открытыми, пока они закрыты.

Тем не менее, очень сложно обнаружить разорванное соединение (разорванное, поскольку маршрутизатор умер и т. д., в отличие от закрытого) без фактической отправки данных, поэтому большинство приложений каждый раз выполняют какую-то реакцию пинг / понг. так часто, просто чтобы убедиться, что соединение действительно активно.

67
ответ дан 24 November 2019 в 10:45
поделиться

Вы ищете опцию сокета SO_KEEPALIVE.

Java Socket API предоставляет приложениям поддержку активности через setKeepAlive и getKeepAlive методы.

РЕДАКТИРОВАТЬ: SO_KEEPALIVE реализован в стеках сетевых протоколов ОС без отправки «реальных» данных. Интервал проверки активности зависит от операционной системы и может быть настроен с помощью параметра ядра.

Поскольку данные не отправляются, SO_KEEPALIVE может проверять только работоспособность сетевого подключения, но не работоспособность службы, к которой подключен сокет. к. Чтобы проверить последнее, вам нужно реализовать что-то, что включает отправку сообщений на сервер и получение ответа.

53
ответ дан 24 November 2019 в 10:45
поделиться

Поддержка активности TCP и поддержка активности HTTP - это очень разные концепции. В TCP keepalive - это административный пакет, отправляемый для обнаружения устаревшего соединения. В HTTP, keepalive означает постоянное состояние соединения.

Это из спецификации TCP,

Keep-alive пакеты ДОЛЖНЫ отправляться только в том случае, если для соединения не было получено никаких пакетов данных или подтверждений в течение определенного интервала. Этот интервал ДОЛЖЕН быть настраиваемым и ДОЛЖЕН по умолчанию составлять не менее двух часов.

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

33
ответ дан 24 November 2019 в 10:45
поделиться

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

Эта и другие подобные проблемы (где-то между двумя конечными точками) могут означать, что соединение больше не будет "работать", если вы пытаетесь отправить данные после разумного периода бездействия. Однако вы можете не обнаружить этого, пока не попробуете отправить данные.

Использование пакетов поддержки активности и снижает вероятность прерывания соединения где-то на линии, а также позволяет вам найти раньше сообщить о разрыве соединения.

23
ответ дан 24 November 2019 в 10:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: