【问题标题】:C++ Release network port that is used by another process on WindowsC++ 释放 Windows 上另一个进程使用的网络端口
【发布时间】:2016-08-08 18:59:30
【问题描述】:

编辑:我看不出我的问题有什么问题。它不是重复的,即使人们指责它是重复的。如果您仍然决定对该问题投反对票,请告诉我原因,以便我理解。谢谢。

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

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

是否只是使用DuplicateObject 关闭句柄的问题,或者它是如何完成的?

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

编辑: 我发现WSADuplicateSocket 看起来很有希望。但它必须从已经拥有Descriptor identifying the local socket 的进程中调用,正如微软所说的那样。如果我能以某种方式得到Descriptor identifying the local socket,我也许可以就此致电closesocket。这可能可以通过代码注入来完成,但我相信有更好的方法。

编辑: 据称,一个名为CurrPorts 的工具能够完成我想做的事情。所以这绝对是可能的......但是如何?

【问题讨论】:

  • 为什么这个标签是c++?强制关闭 Skype。见stackoverflow.com/questions/788348/…
  • 您可以在Skype中关闭“使用端口80和443进行其他传入连接”选项。
  • 这不是我要求的。我对强制关闭任何进程既不感兴趣,也不希望更改其他应用程序设置。我不回答“为什么用 C++ 标记”的答案。如果您真的认为这个问题值得一票否决,请告诉我原因。你肯定不能指望我在这里提供“我试过的”的代码..
  • 您不能认真地期望现代操作系统会为您提供破坏其他进程的工具。
  • 哦,是的,我可以。您会看到 DuplicateObject 已经提供了关闭其他进程句柄的功能。这绝对不一定会破坏流程。即使。关闭进程可能会造成与此一样多的损害,甚至可能更多。

标签: c++ windows winapi port winsock


【解决方案1】:

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

C++ Get Handle of Open Sockets of a Program

但是,更暴力的方法是使用 DuplicateHandle()DUPLICATE_CLOSE_SOURCE 标志。无需代码注入:

【讨论】:

  • 我枚举了所有句柄并记录了我得到的句柄类型。以下是完整列表:pastebin.com/DZDTgZ7K 我无法将任何东西识别为“套接字对象”。我也不确定套接字是否真的有句柄,因为微软在谈到套接字时总是谈论Descriptors 而不是Handles
  • @Forivin 套接字是 Windows 上的内核对象,并且有真正的句柄。请参阅Socket handles,了解如何在句柄枚举期间检测它们并查询它们的端口详细信息。
猜你喜欢
  • 2014-11-10
  • 2017-03-23
  • 1970-01-01
  • 2012-06-19
  • 2012-11-03
  • 1970-01-01
  • 1970-01-01
  • 2011-12-01
  • 1970-01-01
相关资源
最近更新 更多