如何获得服务在Windows Server 2003上的端口80上侦听

我已经编写了一个自定义的Windows服务来监听TCP端口80,但是当我尝试在Windows Server 2003计算机上安装它时,它启动失败,因为其他服务已经在该端口上侦听。 到目前为止,我已经禁用IISpipe理服务和HTTP SSL服务,但没有运气。

当我运行netstat -a -n -o | findstr 0.0:80 netstat -a -n -o | findstr 0.0:80它给我的进程id 4作为罪魁祸首,但是当我看着正在运行的进程,处理ID指向“系统”进程。

我能做些什么来使系统进程停止监听端口80,并让我的服务来监听呢?

PS我应该指出,如果我的Windows XP或Windows 7开发盒安装它的服务运行良好。 另外,我应该指出,这与服务无关。 我尝试启动一个常规应用程序,试图绑定到Windows Server 2003上的端口80,结果相同 – 它失败,因为另一个应用程序已经绑定到该端口。

你想停止“万维网发布服务”。

顺便说一句,“系统”进程实际打开端口的原因是因为Windows Server 2003将部分IIS移入内核(特别是在http.sys驱动程序中)。 这样,像静态文件这样的东西就可以完全从内核(TCP / IP堆栈和文件系统驱动程序运行的地方)提供,而无需用户模式切换,并提供更好的性能。

多亏了一些挖掘我能find解决这个问题。 我能够find解决scheme的部分原因是由@codeka的答案提供的信息。

总而言之,因为Windows Server 2003引入了一个内核模式驱动程序( http.sys )来处理HTTP请求,所以我不得不下载一个名为HttpCfg.exe的工具,该工具附带在Windows XP支持工具中,并用它来指示http.sys停止侦听端口80上的HTTP请求。

这个命令是:

 httpcfg.exe delete iplisten -i 0.0.0.0:80 

运行该命令后,我使用query操作来检查地址是否被删除

 httpcfg.exe query iplisten 

最后,我必须重新启动机器才能使更改生效。 之后,我能够创buildTCP套接字并绑定到端口80。

请注意,其他方法都不起作用(即禁用IISpipe理服务,万维网发布服务或HTTP SSL服务)

注意

当然,这个答案严格地指的是如何通过内核来处理Windows中的内置机制来处理HTTP请求。 但是应该指出,内核似乎提供了比用户模式更好的处理HTTP请求的方法。 有些API可以利用http.sys(内核模式)对请求进行HTTP处理,如果这是一个选项,我build议您探索一下(也就是说,除非您只是试图运行已经构build的服务)