Сокет .NET Remoting не умрет даже после того, как процесс - PullRequest
1 голос
/ 16 марта 2011

Пожалуйста, рассмотрите этот довольно простой сценарий.У меня есть два консольных приложения .NET 4.0 / C #.Давайте назовем их имена «Launcher» и «SocketApp».

Launcher делает только запуск SocketApp при определенных обстоятельствах.Это делается с помощью метода Process.Start ().SocketApp работает некоторое время, и через некоторое время цикл Main () завершается, и процесс останавливается.И процесс остается мертвым, пока Launcher не запустит его снова.(Ни при каких условиях не будет запущено несколько экземпляров SocketApp).И так цикл идет.Это работает нормально несколько дней подряд.

Но иногда SocketApp не запускается.Выдает исключение, когда канал Remoting пытается прослушивать сокет.Исключение создается глубоко во внутреннем коде Remoting, если быть точным, при вызове Bind ().Причиной сбоя вызова bind является то, что сокет так или иначе не был освобожден при ПРЕДЫДУЩЕМ успешном запуске SocketApp.Я знаю, что это так, потому что если я гарантирую, что SocketApp закрыт, и я выполняю команду netstat -n, я вижу, что порт, к которому я хочу подключиться (), связан.Он находится в постоянном состоянии CLOSE_WAIT.И он просто остается в этом состоянии CLOSE_WAIT навсегда.

Единственный способ заставить Windows освободить этот сокет - это (и это странно) закрыть приложение Launcher.Почему в мире это было бы?Launcher работает в своем собственном процессе и вообще не использует сокеты.Единственная цель - запустить SocketApp.Так почему закрытие Launcher освобождает сокет, который использует только SocketApp?Может ли это быть потому, что я не вызываю Dispose () для объекта Process из Launcher?Этот сбой проявляется настолько редко, что требуются дни, чтобы определить, является ли какое-либо конкретное исправление эффективнымЧто-нибудь еще, на что я должен смотреть?

Декстер

1 Ответ

0 голосов
/ 16 марта 2011

На самом деле операционная система может освободить порт в этой точке.Порт будет зависать при использовании в течение 4 минут по умолчанию в Windows .Вот справочник для unix .

...