端口扫描:如何使扫描速度更快?

时间:2012-01-24 03:14:23

标签: c# winforms tcpclient port-scanning

我正在创建一个小工具,让我可以检查给定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秒的时间。

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

我使用了.net 4.0 parallel for / foreach功能。它大大提高了性能。