【问题标题】:C# Detect Localhost Port UsageC# 检测本地主机端口使用情况
【发布时间】:2011-03-04 19:23:54
【问题描述】:

提前感谢您的建议。

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

IE:客户端:20100 -> Internet -> 通过路由器/防火墙暴露的远程 SSH 服务器 -> 本地 Intranet -> Intranet Web POP3 Server: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 服务器交互。以上为一般性说明。我已经知道我正在尝试做的事情不会有问题,所以我不想就上述问题进行辩论。

问题是……如何确保 localhost 上的本地端口(我不能使用动态端口,所以它必须是静态的)没有被任何其他应用程序使用或监听?

我目前正在我的 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 循环中从特定端口开始调用此函数,以在第一个可用端口获得“假”返回。我尝试的第一个端口实际上是由 uTorrent 监听的。上面的代码没有捕捉到这一点,我的连接失败了。

确保端口真正空闲的最佳方法是什么?我确实了解其他一些程序可能会在我测试期间/之后抢占该端口。我只需要找到一些东西,以确保在执行测试时它当前根本不在使用中。

如果有办法在测试期间真正保留 localhost 端口,我很想听听。

【问题讨论】:

  • 想知道我是否应该为此离开 Putty 并使用 SharpSSH。还有其他适用于 c#/vb 的好的 SSH 源代码吗?

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


【解决方案1】:

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

【讨论】:

  • 不幸的是,该站点上的所有三个示例都未能检测到 uTorrent 在起始端口上侦听。这太奇怪了。还有其他想法吗?
  • 你能显示命令“netstat -anbp tcp”的输出吗?我对 uTorrent.exe 的行感兴趣
  • 这里只是使用 LINQ 编写此代码的一种更短的方法。 IPGlobalProperties ipGp = IPGlobalProperties.GetIPGlobalProperties(); IPEndPoint[] 端点 = ipGp.GetActiveTcpListeners(); if (endpoints.Length == 0) { return false; } return endpoints.Any(t => t.Port == port);
  • 如何获取处于“ESTABLISHED”状态的端口
猜你喜欢
  • 2011-03-07
  • 2019-07-15
  • 1970-01-01
  • 2020-07-24
  • 2015-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多