UDP-сокеты не имеют соединения, поэтому к ним не прилагается никакого реального состояния «открытости» - в отличие от TCP-сокетов, где сокет может находиться в любом количестве состояний соединения, что определяется обменом пакетами до заданного точка.
Единственный смысл, в котором UDP-сокеты можно открывать и закрывать, заключается в том, что они являются объектами системного уровня с некоторым внутренним состоянием и дескриптором файла. Сокеты никогда не закрываются автоматически в случае ошибки и остаются открытыми бесконечно, если только их собственный процесс не завершится или не вызовет close
для них.
Для решения вашей другой проблемы, если порт назначения на хосте назначения не открыт, отправитель пакета UDP никогда не узнает. ** UDP не предоставляет никаких средств подтверждения приема получателем. Пакет маршрутизируется и, если он поступает на хост, проверяется на правильность и либо успешно принимается, либо отбрасывается. Существует ряд причин, по которым send
может возвращать код ошибки при записи в UDP-сокет, но ни одна из них не связана с состоянием принимающего хоста. ** Я рекомендую обратиться к справочной странице sendto
для возможных режимов отказа.
С другой стороны, в случае, если сокет TCP пытается подключиться к неоткрытому порту, отправитель никогда не получит подтверждение своего первоначального запроса на подключение, и в конечном итоге connect
не удастся. На этом этапе отправитель может прекратить отправку данных через сокет (поскольку это приведет только к большему количеству ошибок), но даже в этом случае дескриптор файла сокета никогда не закрывается автоматически.
** См. Ответ @Zuljin в комментариях.