【问题标题】:c# Sure Fire Way to Detect Port Usagec# Sure Fire 检测端口使用情况的方法
【发布时间】:2011-03-07 07:29:56
【问题描述】:

最近在这个问题上来来回回。尝试使用 Putty 将 SSH 隧道从我机器上的 localhost 端口连接到 Internet 可访问 SSH 服务器另一侧的内部端口。 Putty 不检查端口是否可用。在我打开 Putty 连接之前,我想验证端口是否空闲。

如果端口可用,它可以正常工作,但我需要一种可靠的方法来保证在我在代码中检查端口时端口没有打开。我使用了各种方法,结果很糟糕。我目前正在使用以下代码:

    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;
    }

我在计算机上安装了 uTorrent。当我尝试使用端口 3390 时,它失败了,因为 uTorrent 正在通过 TCP 监听该端口。有没有办法确保在给定端口上根本不使用 TCP?

【问题讨论】:

    标签: c# tcp c#-4.0 localhost


    【解决方案1】:

    如果您正在检查一个程序并希望在另一个程序中使用该端口,那么总会存在竞争条件。如果您在一个程序中执行所有操作您可以创建一个套接字并绑定到端口 0,系统将为您选择一个空闲端口,这样您就不会与另一个进程发生冲突。

    【讨论】:

    • 我并不期待一切都结束...我意识到在测试和使用之间可能会占用一个端口。我对这个应用程序唯一关心的是确保我测试的端口在测试时真的可用..没有问题。上面的代码失败了......因此问题。我只是想测试一下端口,如果可用,点 Putty 抓取它。
    【解决方案2】:

    好吧,因为你不关心比赛条件。

    尝试将 socket() 绑定到通配符 IP 地址 (0.0.0.0) 上的端口。如果成功,则没有人拥有该端口。 (当然,现在你有了端口,所以不要忘记关闭它。)

    【讨论】:

    • 好的。我会在这个周末试一试,然后回复。
    猜你喜欢
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    • 2015-06-22
    • 1970-01-01
    • 1970-01-01
    • 2019-02-28
    • 1970-01-01
    • 2021-11-19
    相关资源
    最近更新 更多