Я реализовал небольшую службу 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, чтобы убить дочерние процессы всякий раз, когда их родительский процесс убивается?
Спасибо!