1

У меня есть программа, которая иногда пропускает соединение TCP.

После завершения программы я вижу, что порт занят. TCPViewer показывает "несуществующий" в столбце "Процесс".

Если я пытаюсь "Завершить процесс" или "Закрыть соединение", ничего не происходит.

Если я перезагружаю сервер, порт освобождается. Но как я могу сказать Windows освободить этот порт без перезагрузки?

РЕШЕНИЕ: это был dw20.exe (Отчет об ошибках Microsoft), который сдерживал его.

1 ответ1

1

Операционная система автоматически закроет все TCP-соединения при выходе из процесса 1.

Вероятно, вы видите соединение в состоянии TIME-WAIT («... означает ожидание в течение достаточного времени, чтобы убедиться, что удаленный узел получил подтверждение своего запроса на завершение соединения»).

Это не должно быть проблемой для клиентов, так как хост может устанавливать несколько соединений TCP с одним и тем же удаленным портом host:port.

Для сервера можно использовать SO_REUSEADDR.

Что именно делает SO_REUSEADDR?

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

Было указано, что «сокет представляет собой 5-ти кортеж (прото, локальный адрес, локальный порт, удаленный адрес, удаленный порт). SO_REUSEADDR просто говорит, что вы можете повторно использовать локальные адреса. Кортеж 5 все еще должен быть уникальным!"Майкл Хантер (mphunter@qnx.com). Это действительно так, и поэтому маловероятно, что ваш сервер когда-либо увидит неожиданные данные. Опасность заключается в том, что такой кортеж 5 все еще витает в сети, и пока он прыгает вокруг, новое соединение от того же клиента в той же системе получает тот же удаленный порт. Это объясняется Ричардом Стивенсом в `2.7. Пожалуйста, объясните состояние TIME_WAIT.''.

Смотрите также этот ответ StackOverflow: Использование SO_REUSEADDR - Что происходит с ранее открытым сокетом?


1 Технически, когда все дескрипторы этого соединения уничтожены. Несколько процессов могут иметь дескриптор файла.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .