Сканирование портов: как сделать сканирование быстрее? - PullRequest
1 голос
/ 24 января 2012

Я создаю небольшой инструмент, который позволяет мне проверять состояние портов с указанным 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 ]

2 голосов
/ 24 января 2012

Один из вариантов - реализовать необработанные сокеты в чем-то вроде SharpPcap или Pcap.NET и перехватить ответ об ошибке ICMP. Более простой подход заключается в том, чтобы уменьшить время ожидания. Вот несколько идей о том, как это сделать. Здесь это связанный вопрос, который также может помочь.

Если вы строго ищете способы улучшить производительность кода, который вы разместили, то вы можете попробовать проверить связь с адресом, прежде чем пытаться подключиться к нему (при условии, что это связано с вашим предыдущим вопросом об удаленных хостах ARP) и поскольку String является неизменяемым, оператор + обычно медленнее, чем использование чего-то вроде String.Format. Эти предложения не будут сокращать время обработки (хотя, скорее всего, вы не сможете заметить разницу).

1 голос
/ 24 января 2012

Я создал такой инструмент, чтобы пинговать все IP-адреса в сети и получать ответ обратно.

Для этого я использовал параллель .net 4.0 для функций / foreach. Это резко увеличило производительность.

...