Операционная система автоматически закроет все TCP-соединения при выходе из процесса 1.
Вероятно, вы видите соединение в состоянии TIME-WAIT («... означает ожидание в течение достаточного времени, чтобы убедиться, что удаленный узел получил подтверждение своего запроса на завершение соединения»).
Это не должно быть проблемой для клиентов, так как хост может устанавливать несколько соединений TCP с одним и тем же удаленным портом host:port.
Для сервера можно использовать SO_REUSEADDR.
Эта опция сокета сообщает ядру, что, даже если этот порт занят (в состоянии TIME_WAIT), продолжайте и все равно используйте его. Если он занят, но с другим состоянием, вы все равно получите адрес, который уже используется. Это полезно, если ваш сервер был выключен, а затем сразу же перезапущен, пока сокеты все еще активны на своем порту. Вы должны знать, что если появятся какие-либо неожиданные данные, это может запутать ваш сервер, но, хотя это возможно, это маловероятно.
Было указано, что «сокет представляет собой 5-ти кортеж (прото, локальный адрес, локальный порт, удаленный адрес, удаленный порт). SO_REUSEADDR просто говорит, что вы можете повторно использовать локальные адреса. Кортеж 5 все еще должен быть уникальным!"Майкл Хантер (mphunter@qnx.com). Это действительно так, и поэтому маловероятно, что ваш сервер когда-либо увидит неожиданные данные. Опасность заключается в том, что такой кортеж 5 все еще витает в сети, и пока он прыгает вокруг, новое соединение от того же клиента в той же системе получает тот же удаленный порт. Это объясняется Ричардом Стивенсом в `2.7. Пожалуйста, объясните состояние TIME_WAIT.''.
Смотрите также этот ответ StackOverflow: Использование SO_REUSEADDR - Что происходит с ранее открытым сокетом?
1 Технически, когда все дескрипторы этого соединения уничтожены. Несколько процессов могут иметь дескриптор файла.