如何使用“C”在 Windows 中找到空闲的 TCP 端口

Posted

技术标签:

【中文标题】如何使用“C”在 Windows 中找到空闲的 TCP 端口【英文标题】:How to find a free TCP Port in windows using 'C' 【发布时间】:2016-04-10 16:07:33 【问题描述】:

我想要两个使用 Windows 套接字通过 TCP/IP 进行通信的 Windows 应用程序。在此,我希望我的程序自动选择可用的空闲端口来建立连接。

有没有办法使用 C 或 C++ 程序找到空闲的 TCP 端口?

确切地说,我想在服务器端自动检测一个空闲端口,并让客户端知道相同的端口(连接到服务器)。

感谢您的宝贵时间!

【问题讨论】:

您可以暴力破解高(非标准)端口。 (服务器和客户端都将尝试,客户端将继续搜索,直到合适的端口建立连接(握手)) here 清楚地表明了寻找空闲端口。但是如何将此端口信息传达给客户端? 为什么要这样做?这将是防火墙之类的痛苦。 @Ronnie:仅仅扫描端口是不够的。客户端可能会连接许多开放端口,但并非所有端口都会提供握手协议来发现连接的服务器类型。但是,如果您有自己的服务器向连接的客户端提供握手问候,您的客户端可以查找该问候并忽略它连接到的任何其他不提供它的服务器。 @RemyLebeau,我只是想说。也许我的话没有表达我的表情:) 【参考方案1】:

我想自动检测服务器端的空闲端口

只需 bind() 将您的侦听 TCP 套接字连接到端口 0。操作系统将为您选择一个可用端口。然后,您可以使用getsockname() 检索选定的端口。

让客户端知道相同的端口(连接到服务器)。

您必须将选定的 TCP 侦听端口发布到客户端可以在需要时从中查询的位置。

如果客户端和服务器在同一个网络子网上,一个简单的解决方案是让服务器在固定端口上打开一个单独的侦听 UDP 套接字,然后让客户端向该子网广播 IP 发送 UDP 广播港口。当服务器接收到广播时,它可以向指定 TCP 侦听端口的客户端发送回复。然后客户端可以连接到该端口上的 TCP 服务器。

【讨论】:

不幸的是,有时我们不使用套接字来监听自己,而是将其传递给a Windows api。所以在我们调用函数之前,我们需要一种方法来“在Windows中使用'C'找到一个空闲的TCP端口” @IanBoyd 抱歉,根本没有办法做到这一点。只有操作系统知道哪些端口是空闲的,并且没有 API 可以查询该信息。此外,即使这样的查询是可能的,它也将是一个TOCTTOU race condition,因为找到的端口可能会在你有机会自己打开它之前被其他人使用。使用空闲端口的唯一安全(和理智)方法是让操作系统在bind()'ing 或connect()'ing 套接字时为您选择它。 @IanBoyd 无论如何,我看不出这与您链接到的 API 有什么关系 (HttpAddUrl())。您要解决的实际问题是什么?请明确点。这与XY Problem 领土接壤。该 API 似乎需要 HTTP 服务器实际用于侦听入站连接的预先存在的 TCP 端口。所以无论如何寻找一个免费端口是没有意义的。 我需要找到一个空闲的 TCP 端口——这样我才能在那个端口上监听。显然bind() 不是一个选项,因为我没有使用套接字 api 进行监听。因此,我们需要回答“如何使用 C 在 Windows 中找到空闲的 TCP 端口”这个问题。有什么想法吗? “答案是:你不能!!”。优秀;您应该以答案的形式提出。

以上是关于如何使用“C”在 Windows 中找到空闲的 TCP 端口的主要内容,如果未能解决你的问题,请参考以下文章

如何防止Windows进入空闲状态?

Windows 应用程序中的系统空闲检测

如何使用 Ruby 找到免费的 TCP 服务器端口?

带有 Windows 身份验证的 ASP.Net Core 3.1 中的空闲超时

c程序cpu占用率

如何激活Windows 10 LTSB