C++释放Windows上另一个进程使用的网络端口

C++ Release network port that is used by another process on Windows

本文关键字:网络 进程 释放 Windows 另一个 C++      更新时间:2023-10-16

编辑:我看不出我的问题有什么问题。这不是重复的,尽管人们指责它是重复的。如果你无论如何决定否决这个问题,请告诉我为什么,这样我就能理解。谢谢

如何强制另一个进程关闭它当前正在使用的端口例如如果Skype正在本地端口80上侦听。如何以编程方式强制Skype再次释放该端口,以便在同一端口上正确运行XAMPP?不更改Skype设置或关闭Skype。

是的,我知道这可能会导致意想不到的行为。

这只是使用DuplicateObject关闭句柄的问题,还是如何完成的问题?

我对关闭进程或找出哪个进程阻塞了端口不感兴趣。我已经知道即使没有netstat,这是如何正确完成的。

编辑:我找到了WSADuplicateSocket,它看起来很有前途。但它必须从已经有微软称之为Descriptor identifying the local socket的进程中调用。如果我能以某种方式得到Descriptor identifying the local socket,我可能就能调用closesocket。这可能可以通过come代码注入来完成,但我相信还有更好的方法。

编辑:据称,一个名为CurrPorts的工具可以做我想做的事情。所以它绝对有可能。。。但是怎么做呢?

从另一个进程访问套接字的正确方法是向调用WSADuplicateSocket()的进程注入代码,以复制所需的套接字句柄供您的进程访问,然后通过IPC将详细信息发送到您的进程,并通过WSASocket()访问套接字。参见:

C++处理程序的开放套接字

然而,一种更暴力的方法是使用带有DUPLICATE_CLOSE_SOURCE标志的DuplicateHandle()。无需代码注入:

  • 查找拥有所需打开端口的进程ID(请参阅GetTcpTable2()GetExtendedTcpTable()以及其他相关函数)
  • 使用OpenProcess()打开进程ID的句柄
  • 通过NtQuerySystemInformation(SystemHandleInformation)枚举进程的打开句柄(请参阅HOWTO:枚举句柄),查找打开的套接字对象
  • 使用NtDeviceIoControlFile()查询每个套接字句柄的IP/端口信息,以确定哪个套接字对象正在使用您想要的端口(请参见套接字句柄)
  • 然后最后CCD_ 13找到的套接字句柄来关闭它(无需指定将其复制到的目标)