Как я уничтожаю процесс, который мертв, но слушает?

Я разрабатываю приложение, которое слушает на порте 3000. По-видимому, существует экземпляр его, все еще слушая порт, потому что каждый раз, когда я запускаю его, это не может создать слушателя (C#, TcpListener, но это не важно), потому что порт уже взят.

Теперь, приложение не существует в Диспетчере задач, таким образом, я пытался найти его PID и уничтожить его, который привел к этому интересному результату:

C:\Users\username>netstat -o -n -a | findstr 0.0:3000
   TCP    0.0.0.0:3000           0.0.0.0:0              LISTENING       3116

C:\Users\username>taskkill /F /PID 3116
ERROR: The process "3116" not found.

Я не видел это поведение прежде и полагал, что было достаточно интересно видеть, есть ли у кого-либо решение.

ОБНОВЛЕНИЕ: Я запустил Проводник Процесса и сделал поиск 3000 и нашел это:

<Non-existent Process>(3000): 5552

Я щелкнул правой кнопкой по нему и выбрал "Close Handle". Это больше не находится в Проводнике Процесса, но все еще обнаруживается в netstat и все еще мешает приложению запустить слушателя.

ОБНОВЛЕНИЕ 2: Найденные TCPView для Windows, которые показывают процесс как "<non-existent>". Как с CurrPorts, ничего не происходит, когда я пытаюсь закрыть соединение в этом инструменте.

49
задан 26.07.2012, 15:58

6 ответов

Избегать бесконечный ожидает на сокете, Ваша программа должна использовать функцию setsockopt с SO_REUSEADDR и параметрами SO_RCVTIMEO:

SO_REUSEADDR : Allows the socket to be bound to an address that is already in use.
SO_RCVTIMEO : Sets the timeout, in milliseconds, for blocking receive calls. 
13
ответ дан 07.12.2019, 08:31

Я не предполагаю Вас, брандмауэр установил (или попробовал какой-либо Windows, объединяющий тонкие настройки в сеть)?

Некоторые брандмауэры показывают этот вид поведения и могут сохранить порты открытыми.

Если Вы действительно имеете один, попытайтесь отключить его и затем запустить Вашу программу и закрыть его и видеть то, что происходит.

0
ответ дан 07.12.2019, 08:31

Должен упомянуть, что термин задерживается здесь.

Детали могут быть найдены по http://msdn.microsoft.com/en-us/library/ms739165.aspx

Вкратце: существует опция, которая говорит системе сокета сохранять сокет открытым даже после того, как это было закрыто, если неотправленный данные присутствует.

В Вашем приложении C# можно указать любые связанные опции через Сокет. SetSocketOption: http://msdn.microsoft.com/en-us/library/1011kecd.aspx

Так как весь упомянутый материал связан с отправкой и клиентами, но у нас были подобные проблемы на работе, некоторый дальнейший поиск кутил, что можно было указать задерживаться опцию для слушателей как показано в примере здесь: http://msdn.microsoft.com/library/system.net.sockets.tcplistener.server.aspx

Некоторые коллеги говорили о портах, сохраненных ОС после завершения/закрытия приложения в течение приблизительно двух минут. Учитывая, что, было бы интересно услышать, сохранен ли порт все еще после определенного количества времени.

1
ответ дан 07.12.2019, 08:31

Попытайтесь бросить '-b' флаг на Вашу команду netstat. Это скажет Вам название исполняемого файла, который использует порт. Затем найдите, что proc в диспетчере задач и уничтожают его там. Если это не работает сообщение, что исполняемый файл, это содержит открытый порт.

1
ответ дан 07.12.2019, 08:31

Можно ли видеть процесс в Проводнике Процесса? Если да, чем Вы может уничтожить его оттуда, но только после исследования то, что это на самом деле (Вы видите весь dlls, загруженный в процесс),

1
ответ дан 07.12.2019, 08:31

Я думаю, что необходимо дать CurrPorts попытку

CurrPorts является сетевым контрольным программным обеспечением, которое отображает список всех в настоящее время открываемых портов TCP/IP и UDP на Вашем локальном компьютере. Для каждого порта в списке информация о процессе, который открыл порт, также отображена, включая имя процесса, полный путь процесса, информацию о версии процесса (название продукта, описание файла, и так далее), время, когда процесс был создан, и пользователь, который создал его.

Кроме того, CurrPorts позволяет Вам закрывать нежелательные соединения TCP, уничтожать процесс, который открыл порты, и сохраните информацию портов TCP/UDP в файл HTML, XML-файл, или в файл разделенного текста вкладки.

CurrPorts также автоматически отмечают с розовыми цветными подозрительными портами TCP/UDP, принадлежавшими неопознанным приложениям (Приложения без информации о версии и значков)

alt text

7
ответ дан 07.12.2019, 08:31

Так как Ваш процесс перечислен как Система, скорее всего, можно уничтожить его на "Системной" командной строке. Системная учетная запись имеет больше полномочий, чем постоянный администратор.

Вы можете получить "Система" cmd.exe путем планирования задачи для cmd.exe (выполнения планировщика как Система):

at 15:23 /interactive "cmd.exe" 

Изменение то время для чего-то в ближайшем будущем. Удостоверьтесь также, что Вы находитесь на консоли машины (если Вы будете на регулярной сессии терминального сервера, то Вы не будете видеть новый cmd.exe. Сделать mstsc войдите в консоль). Я предполагаю там другие способы сделать это, но это работало на меня в прошлом.

0
ответ дан 07.12.2019, 08:31

Теги

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