C# 检测本地主机端口使用情况

Tha*_*ORD 1 networking network-programming network-protocols c#-4.0

在此先感谢您的建议。

我目前正在开发一个程序,该程序使用 Putty 创建与服务器的 SSH 连接,该服务器使用本地端口转发使运行我的软件的客户端能够通过本地主机访问 SSH 服务器后面的服务。

IE:客户端:20100 -> Internet -> 通过路由器/防火墙暴露的远程 SSH 服务器 -> 本地内网 -> 内网 Web POP3 服务器:110。

Cmd 行:“putty -ssh -2 -P 22 -C -L 20100:inranteIP:110 -pw sshpassword sshusername@sshserver”

客户端将使用 putty 创建与 SSH 服务器的 SSH 连接,并在连接字符串中指定它要将 Intranet POP3 服务器的端口 110 绑定到客户端系统上的端口 20100。因此,客户端将能够打开一个到 localhost:20100 的邮件客户端,并通过 SSH 隧道与内部 POP3 服务器交互。以上是一般的描述。我已经知道我正在尝试做的事情会毫无问题地工作,所以我不想就上述问题进行辩论。

问题是...如何确保本地主机上的本地端口(我不能使用动态端口,因此它必须是静态的)未被任何其他应用程序使用或侦听?

我目前正在我的 C# 应用程序中执行此代码:

private bool checkPort(int port)
{
    try
    {
        //Create a socket on the current IPv4 address
        Socket TestSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

        // Create an IP end point
        IPEndPoint localIP = new IPEndPoint(IPAddress.Parse("127.0.0.1"), port);

        // Bind that port
        TestSocket.Bind(localIP);

        // Cleanup
        TestSocket.Close();

        return false;
    }
    catch (Exception e)
    {
        // Exception occurred. Port is already bound.
        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

我目前正在以 for 循环中的特定端口开始调用此函数,以在第一个可用端口处返回“false”。我尝试的第一个端口实际上是被 uTorrent 监听的。上面的代码没有捕捉到这一点,我的连接失败了。

确保端口真正免费的最佳方法是什么?我确实了解其他一些程序可能会在我测试期间/之后获取端口。我只需要找到一些可以确保在执行测试时当前根本没有使用它的东西。

如果有一种方法可以在测试期间真正保留 localhost 端口,我很想听听。

Vad*_*iak 6

这是如何检查本地端口是否空闲的答案。

我会推荐这种方式:

bool IsBusy(int port)
{
    IPGlobalProperties ipGP = IPGlobalProperties.GetIPGlobalProperties();
    IPEndPoint[] endpoints = ipGP.GetActiveTcpListeners();
    if ( endpoints == null || endpoints.Length == 0 ) return false;
    for(int i = 0; i < endpoints.Length; i++)
        if ( endpoints[i].Port == port )
            return true;
    return false;          
}
Run Code Online (Sandbox Code Playgroud)