web-dev-qa-db-ja.com

特定のTCPポートでリッスンを開始できませんが、現在リッスンしているものはありません

WCFサービスホストを使用してTCPポート61000で接続をリッスンするWindowsサービスがあります。サービスを開始しようとすると、次のエラーが発生します。

Service cannot be started. System.ServiceModel.AddressAlreadyInUseException: HTTP could not register URL http://+:61000/ because TCP port 61000 is being used by another application. ---> System.Net.HttpListenerException: The process cannot access the file because it is being used by another process
   at System.Net.HttpListener.AddAll()
   at System.Net.HttpListener.Start()
   at System.ServiceModel.Channels.SharedHttpTransportManager.OnOpen()
   --- End of inner exception stack trace ---
   at System.ServiceModel.Channels.SharedHttpTransportManager.OnOpen()
   at System.ServiceModel.Channels.TransportManager.Open(TransportChannelListener channelListener)
   at System.ServiceModel.Channels.TransportManagerContainer.Open(SelectTransportManagersCallback selectTransportManagerCallback)
   at System.ServiceModel.Channels.HttpChannelListener.OnOpen(TimeSpan timeout)
   at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
   at System.ServiceModel.Dispatcher.ChannelDispatcher.OnOpen(TimeSpan timeout)
   at...

クイック netstat -aは、ポート61000でリッスンしているものがないことを示しています。オンラインで netstatを使用して名前空間を予約する について言及している投稿もいくつか見つかりましたが、サービスが実行されているアカウントには管理者権限があるため、それは必要ないはずです。

このメッセージが表示される理由に関する他のアイデアはありますか?

このサービスは、64ビットのWindows Server 2008 R2Standardで実行されています。

2
John Rasch

プログラムが閉じられたときにポートで開いている接続があり、TCPが4方向のクローズハンドシェイクを完了しなかった場合、ソケットはタイムアウトまで「半分閉じられた」ままになりますが期限切れになり(プログラムが終了した場合でも)、そのポートを再度開くことができなくなります。さまざまな実装には、通常1/2秒から2分の範囲のさまざまなタイムアウトがあります。

2
Chris S