Порт TCP зарезервирован дочерним процессом после смерти родительского процесса (.net 3.5) - PullRequest
6 голосов
/ 28 апреля 2011

Я реализовал небольшую службу WCF в .net 3.5, к которой клиенты подключаются по TCP через порт 4321. Этот сервис может порождать другие процессы (через System.Diagnostics.Process). Конечно, когда служба убита или падает, порожденные процессы остаются. У меня проблема: если я пытаюсь перезапустить службу, пока эти процессы еще работают, я получаю следующее исключение:

CommunicationException: есть уже слушатель на конечной точке IP 0.0.0.0:4321. Убедитесь, что вы не пытаетесь использовать эту конечную точку несколько раз в вашем приложении и что нет других приложений прослушивание этой конечной точки.

Действительно, когда я запускаю netstat, я вижу, что есть процесс, который прослушивает порт TCP 4321:

TCP 0.0.0.0:4321 MTL-WKS-AG196: 0 СЛУШАТЬ 97308

Идентификатор процесса, который вы видите здесь (97308), является одним из сервисов, которые я впервые запустил (который больше не должен существовать, поскольку он был убит). Единственный способ освободить порт - это уничтожить все процессы, которые были созданы в течение срока службы службы.

Я не знаю много о портах и ​​процессах, но, насколько я понимаю, дочерний процесс "наследует" порты, прослушиваемые родительским процессом. Это более или менее, что происходит?

Есть ли способ отменить это поведение? Не имея доступа к коду порожденного процесса?

Кроме того, я не думаю, что это возможно, но есть ли способ сказать Windows, чтобы убить дочерние процессы всякий раз, когда их родительский процесс убивается?

Спасибо!

1 Ответ

1 голос
/ 19 июля 2011

Очевидно, BCL позволяет наследовать все дескрипторы дочернему процессу (в данном случае это порт) См. Ответ Стивена Клири на форуме MSDN

У меня сейчас такая же проблема, и я использую временный обходной путь. Я включил службу общего доступа к портам Net.Tcp и включил ее в качестве службы wcf app.config. (Подробнее здесь )

Будет стремиться реализовать предложения Стивена как более постоянное решение, когда у меня будет время:)

...