如何讓服務在 Windows Server 2003 上偵聽埠 80
我編寫了一個偵聽 TCP 埠 80 的自定義 Windows 服務,但是當我嘗試在 Windows Server 2003 機器上安裝它時,它無法啟動,因為其他一些服務已經在偵聽該埠。到目前為止,我已經禁用了 IIS Admin 服務和 HTTP SSL 服務,但沒有運氣。
當我執行
netstat -a -n -o | findstr 0.0:80
它時,它給了我程序 id 4 作為罪魁禍首,但是當我查看正在執行的程序時,程序 id 指向“系統”程序。我該怎麼做才能讓系統程序停止監聽埠 80 並讓我的服務改為監聽?
PS 我應該指出,如果我將它安裝在我的 Windows XP 或 Windows 7 開發盒上,該服務執行良好。另外,我應該指出這與它是一項服務無關。我嘗試啟動一個正常應用程序,該應用程序嘗試綁定到 Windows Server 2003 上的埠 80,但結果相同——它失敗了,因為另一個應用程序已經綁定到該埠。
由於更多的探勘,我能夠找到解決這個問題的方法。我之所以能夠找到解決方案,部分原因是@codeka的回答提供了資訊。
總而言之,因為 Windows Server 2003 引入了核心模式驅動程序 (
http.sys
) 來處理 HTTP 請求,所以我必須下載 Windows XP 支持工具中的一個名為HttpCfg.exe的實用程序,並使用它來指示http.sys
停止偵聽埠上的 HTTP 請求80.執行此操作的命令是:
httpcfg.exe delete iplisten -i 0.0.0.0:80
執行該命令後,我使用該
query
操作檢查該地址是否確實已刪除httpcfg.exe query iplisten
最後,我必須重新啟動機器才能使更改生效。之後,我能夠創建 TCP 套接字並綁定到埠 80。
附帶說明一下,其他方法都不起作用(即禁用 IIS Admin 服務、全球資訊網發布服務或 HTTP SSL 服務)
筆記
當然,答案嚴格來說是指如何開啟 Windows 內置的機制,通過核心處理 HTTP 請求。然而應該注意的是,核心似乎提供了一種比在使用者模式下更有效的方式來處理 HTTP 請求。有一些 API 可用於利用 http.sys(核心模式)HTTP 處理請求,如果可以的話,我建議您探索這些 API(即,除非您只是嘗試執行已經建構的服務)
您想停止“全球資訊網發布服務”。
順便說一句,“系統”程序實際打開埠的原因是因為 Windows Server 2003 將 IIS 的一部分移入核心(特別是在 http.sys 驅動程序中)。這樣就可以完全從核心(執行 TCP/IP 堆棧和文件系統驅動程序的地方)提供靜態文件之類的東西,而無需使用者模式切換,並提供更好的性能。