Пожалуйста, не путайте фактические пакеты, отправленные реализацией TCP / IP по сети, и взаимодействие между вашей программой и библиотекой, реализующей TCP / IP.
Сокет - это просто абстракция, представленная вашей программеРеализация TCP / IP (библиотека или ядро ОС).Вы можете визуализировать сокет как соединение с каналом (localIP: port-remoteIP: port).Ваша программа открывает сокет, передает данные через сокет и может закрыть сокет, если он больше не нужен для освобождения ресурсов.Это нормальный поток.Однако реализация TCP / IP может закрывать сокет по своим собственным уважительным причинам.Некоторые из этих причин: отключение кабеля доступа к сети, ошибки сетевой маршрутизации, отключение сервера и т. Д. Таким образом, ваша программа может обнаружить сокет tcp / ip закрытым, даже если он не закрыл его.
Теперь ваш первый вопрос: что мне делать, если моя программа отправляет небольшие сегменты данных с длинной паузой между ними.Ответ: зависит от того, сколько длится пауза и какая программа слушает вас на другой стороне.Большинство реализаций TCP / IP имеют представление о времени ожидания соединения, чтобы предоставить вам абстракции надежного соединения в реальных ненадежных сетях.Таким образом, если ваша программа сделает паузу дольше, чем время ожидания tcp / ip, вы обнаружите, что ваш сокет был закрыт библиотекой, и вам нужно будет снова открыть сокет.Это также может привести к тому, что вы возобновите связь снова, это зависит от программы, которая прослушивает вас на другой стороне канала соединения tcp / ip.
Существуют способы увеличения времени ожидания tcp / ip и его поддержания.Это может быть сделано как часть конфигурации сети, конфигурации программного обеспечения сервера на другом конце или если вы явно просите оставить сокет открытым, установив параметры KEEPALIVE в вызове библиотеки tcp / ip.Будет ли это все еще открыто или нет, зависит.Полная информация о том, как tcp / ip будет держать сокет открытым, не должна смущать вас, поскольку это не имеет никакого отношения к вашему коду.TCP / IP имеет множество настроек и различных тайм-аутов, чтобы обеспечить вашей программе иллюзию стабильного надежного соединения.Хорошая часть - все это скрыто от кода вашей программы, если вы не злоупотребляете им.Держите паузу менее нескольких секунд :) Один набор настроек времени ожидания может хорошо работать для небольших приложений в надежной локальной сети и не будет работать для приложений с высокой нагрузкой или через межконтинентальное соединение.Каждая конкретная ситуация имеет свое собственное решение, часто более одного.
В этом конкретном вопросе «отправлять небольшие данные каждые 20 минут» я бы посоветовал вам закрывать и открывать сокетное соединение для каждого сообщения.Время открытия одного меньше секунды и не должно влиять на ваше общение.Взамен вы получаете меньше сложности в вашем протоколе связи.Приемник всегда запускается заново при новом соединении через сокет, и обе системы могут пользоваться бесплатными ресурсами для связи tcp / ip в течение всех 20 минут, когда вам это не нужно.