tcpview не может уничтожить соединение/процесс

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

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

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

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

РЕШЕНИЕ: Это был dw20.exe (Microsoft Error Reporting), которая сдерживала его.

2
задан 21.03.2011, 11:03

1 ответ

Операционная система автоматически закроет все соединения TCP когда процесс exits1.

То, что Вы видите, является, вероятно, соединением в СОСТОЯНИИ ОЖИДАНИЯ ВРЕМЕНИ ("... представляет ожидание в течение достаточного количества времени для передачи, чтобы быть уверенным, что удаленный узел получил подтверждение своего запроса завершения соединения").

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

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

Что точно делает SO_REUSEADDR?

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

Было указано, что "Сокет является 5 кортежами (первичный, локальный addr, локальный порт, удаленный addr, удаленный порт). SO_REUSEADDR просто говорит, что можно снова использовать локальные адреса. 5 кортежей все еще должны быть уникальными!" Michael Hunter (mphunter@qnx.com). Это верно, и это - то, почему очень маловероятно, что неожиданные данные будут когда-либо замечаться Вашим сервером. Опасность состоит в том, что такие 5 кортежей все еще плавают вокруг в сети, и в то время как это возвращается вокруг, новое соединение от того же клиента, в той же системе, оказывается, получает тот же удаленный порт. Это объяснено Richard Stevens в ''2.7, объясните состояние TIME_WAIT''..

См. также этот ответ StackOverflow: Используя SO_REUSEADDR - Что, оказывается, ранее открывает сокет?


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

1
ответ дан 12.12.2019, 00:17

Теги

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