![如何让服务在 Windows Server 2003 上侦听端口 80](https://linux22.com/image/513567/%E5%A6%82%E4%BD%95%E8%AE%A9%E6%9C%8D%E5%8A%A1%E5%9C%A8%20Windows%20Server%202003%20%E4%B8%8A%E4%BE%A6%E5%90%AC%E7%AB%AF%E5%8F%A3%2080.png)
我编写了一个自定义 Windows 服务,用于侦听 TCP 端口 80,但当我尝试将其安装在 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,结果相同 - 它失败了,因为另一个应用程序已经绑定到该端口。
答案1
您想要停止“万维网发布服务”。
顺便说一句,端口实际上是由“系统”进程打开的,这是因为 Windows Server 2003 将 IIS 的部分功能移入了内核(具体来说是 http.sys 驱动程序)。这样一来,静态文件等内容就可以完全从内核(TCP/IP 堆栈和文件系统驱动程序运行的地方)提供服务,而无需用户模式切换,从而提供更好的性能。
答案2
经过进一步的挖掘,我终于找到了这个问题的解决方案。我之所以能找到解决方案,部分原因是@codeka的回答。
总而言之,由于 Windows Server 2003 引入了内核模式驱动程序(http.sys
)来处理 HTTP 请求,因此我必须下载一个名为Http配置工具它来自 Windows XP 支持工具,并使用它来指示http.sys
停止监听端口 80 上的 HTTP 请求。
执行该操作的命令是:
httpcfg.exe delete iplisten -i 0.0.0.0:80
运行该命令后,我使用该query
操作来检查地址是否确实已被删除
httpcfg.exe query iplisten
最后,我必须重启机器才能使更改生效。之后,我能够创建 TCP 套接字并绑定到端口 80。
附注:其他方法均不起作用(例如禁用 IIS 管理服务、万维网发布服务或 HTTP SSL 服务)
笔记
当然,答案严格来说是指如何关闭 Windows 中用于通过内核处理 HTTP 请求的内置机制。但应该注意的是,内核似乎提供了一种比用户模式更有效的 HTTP 请求处理方式。有可用的 API 来利用 http.sys(内核模式)HTTP 请求处理,如果可以的话,我建议探索这些 API(即,除非您只是尝试运行已经构建的服务)