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

标签 networking network-programming c#-4.0 network-protocols

预先感谢您的建议。

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

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

命令行:“putty -ssh -2 -P 22 -C -L 20100:intranteIP: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;
    }
}

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

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

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

最佳答案

Here's答案如何检查本地端口是否空闲。

我会推荐这种方式:

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

关于networking - C# 检测本地主机端口使用情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3059260/

相关文章:

c++ - 单线程应用程序可能会在阻塞模式下尝试将 QTcpSocket 连接到它自己的 QTcpServer 时超时吗?

java - 如何确保系统通过 LAN 连接?

java - 如何检查 BufferedReader 中是否有数据 10 秒

erlang - 测试时,出现 erlang 错误 : "{badmatch,{error,system_limit}},{module,function,3}"?

c#-4.0 - 将 ExpandoObject 转换为匿名类型

wpf - C# 获取从路径到某个点的所有父目录?

c# - 接口(interface)方法中与委托(delegate)的无效差异

android - 在 Android 中使用 JobScheduler 检测网络状态变化

c - 无法设置套接字选项 IPV6 多播 : No such device error

linux - 为什么设置 O_NONBLOCK 时会阻塞读取?