【问题标题】:Port Scanning: how to make scanning faster?端口扫描:如何使扫描更快?
【发布时间】:2012-01-24 03:14:22
【问题描述】:

我正在创建一个小工具,让我可以像这样检查给定 IP 和端口号的端口状态:

private void ScanPort(IPAddress address, int port)
{
    using (TcpClient client = new TcpClient())
    {
        try
        {
            client.Connect(address, port);
            txtDisplay.AppendText("Port: " + nudFrom.Value.ToString() + 
                " is open." + Environment.NewLine);
        }
        catch (SocketException)
        {
            txtDisplay.AppendText("Port: " + nudFrom.Value.ToString() +
                " is closed." + Environment.NewLine);
        }
    }
}

问题是,当端口打开时,检查大约需要一秒钟,如果端口关闭,则该过程大约需要 20 秒时间。

如何更快地检查打开/关闭的端口?

【问题讨论】:

  • 因为抛出和捕获异常很慢。如果您可以避免对控制流使用异常,您可能会解决速度问题。
  • @Cody Gray,当端口打开时它确实有帮助,只是为了使用 client.connected 但我不确定如何避免 try/catch,因为如果端口关闭它会抛出异常。

标签: c# winforms tcpclient port-scanning


【解决方案1】:

一种选择是在 SharpPcap 或 Pcap.NET 中使用原始套接字来实现这一点,并捕获 ICMP 失败响应。一种更简单的方法是考虑减少超时。 Here 的一些想法关于如何做到这一点。 Here 的相关问题也可能有所帮助。

如果您正在严格寻找方法来提高您发布的代码的性能,那么您可以考虑在尝试连接之前对地址进行 ping 操作(假设这与您之前关于 ARP 远程主机的问题有关) ,并且由于 String 是不可变的,+ 运算符通常比使用 String.Format 之类的要慢。不过,这些建议不会缩短您的处理时间(实际上您可能无法区分)。

【讨论】:

  • 我确实找到了关于您建议查看的 SO 问题的合理答案。现在,我正在尝试专注于我知道已启动并正在运行的 IP,并尝试仅检查端口。一个问题。我正在使用result.AsyncWaitHandle.WaitOne(1000, true),但我不确定我应该将超时设置为多少以获得合理的响应时间,您有什么建议?
  • 这不是我指的超时。套接字连接超时也会影响您的性能。这基本上是您的应用程序在将控制权返回给您的应用程序之前等待 ACK(我认为这是正确的)数据包的时间量。您可以从异步运行连接中受益,并且只等待适合您的应用程序的时间,而不是等待套接字超时。提供的第一个链接包含我所指的示例。
  • 一种或另一种方式将我指向正确的方向。所以基本上我需要在尝试进行任何连接时计算超时。谢谢m8。
【解决方案2】:

我创建了一个类似这样的工具来 ping 网络上的所有 IP 地址并获取响应。

为此,我使用了 .net 4.0 并行 for / foreach 功能。它极大地提高了性能。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2014-11-28
  • 2013-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-01
  • 1970-01-01
相关资源
最近更新 更多