TCPポート80でリッスンするカスタムWindowsサービスをコーディングしましたが、Windows Server 2003マシンにインストールしようとすると、他のサービスがすでにそのポートでリッスンしているため、起動に失敗します。これまでのところ、IIS管理サービスとHTTPSSLサービスを無効にしましたが、運がありません。
実行するとnetstat -a -n -o | findstr 0.0:80
原因としてプロセスID4が表示されますが、実行中のプロセスを見ると、プロセスIDは「システム」プロセスを指しています。
システムプロセスがポート80でのリッスンを停止し、代わりにサービスがリッスンするようにするにはどうすればよいですか?
P.S. Windows XPまたはWindows7開発ボックスにインストールすると、サービスは正常に動作することを指摘する必要があります。また、これはサービスとは関係がないことを指定する必要があります。 Windows Server 2003のポート80にバインドしようとする通常のアプリケーションを起動しようとしましたが、同じ結果になりました。別のアプリケーションがすでにそのポートにバインドされているため、失敗します。
さらに掘り下げたおかげで、この問題の解決策を見つけることができました。 @ codeka の回答によって提供された情報のおかげで、解決策を見つけることができました。
要約すると、Windows Server 2003ではカーネルモードドライバー(http.sys
)HTTPリクエストを処理するには、Windowsに付属している HttpCfg.exe というユーティリティをダウンロードする必要がありましたXPサポートツールとそれを使用してhttp.sys
ポート80でのHTTPリクエストのリッスンを停止します。
それを行うためのコマンドは次のとおりです。
httpcfg.exe delete iplisten -i 0.0.0.0:80
そのコマンドを実行した後、query
アクションを使用して、アドレスが実際に削除されたことを確認しました
httpcfg.exe query iplisten
そして最後に、変更を有効にするためにマシンを再起動する必要がありました。その後、TCPソケットを作成し、ポート80にバインドすることができました。
補足として、他の方法はいずれも機能しませんでした(つまり、IIS管理サービス、またはWorld Wide Web Publishingサービス、またはHTTP SSLサービスを無効にする))
[〜#〜]注[〜#〜]
もちろん、答えは厳密に言えば、カーネルを介してHTTP要求を処理するためにWindowsで利用可能な組み込みメカニズムを無効にする方法です。ただし、カーネルは、ユーザーモードで実現できるよりも効率的なHTTPリクエストの処理方法を提供しているように見えることに注意してください。リクエストのhttp.sys(カーネルモード)HTTP処理を活用するために利用できるAPIがあり、それがオプションである場合(つまり、すでに構築されているサービスを実行しようとしている場合を除く)、それらを調査することをお勧めします。
「ワールドワイドウェブパブリッシングサービス」を停止したい。
ちなみに、ポートが実際に「システム」プロセスによって開かれる理由は、Windows Server2003がIISの一部をカーネル(特にhttp.sysドライバー)に移動したためです。これにより、静的ファイルなどは、ユーザーモードスイッチなしでカーネル(TCP/IPスタックおよびファイルシステムドライバーが実行される場所)から完全に提供され、パフォーマンスが向上します。