Как сканировать порты асинхронно? - PullRequest
2 голосов
/ 24 января 2012

Я пытаюсь выяснить, как сканировать диапазон портов очень быстро, но через несколько часов я готов сдаться.

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

Как это сделать правильно?Небольшие фрагменты, связанные с моим вопросом, действительно приветствуются.

Это то, что у меня есть (обратите внимание, у меня есть строка allDone.WaitOne(1000, true);, которая создает тайм-аут для соединения. Благодаря этому тайм-аут замедляет проверку, когда IP не работает,без этого у меня не хватает времени, чтобы получить результат)

private void btnScan_Click(object sender, EventArgs e)
{
    for (i = (int)nudFrom.Value; i < nudTo.Value; i++)
    {
        ScanPort(IPAddress.Parse(txtIP.Text), i);
    }
}

private void ScanPort(IPAddress address, int port)
{
    using (TcpClient client = new TcpClient())
    {
        allDone.Reset();

        client.BeginConnect(address, port, new AsyncCallback(ConnectCallback), null);

        allDone.WaitOne(1000, true);

        if (client.Connected) txtDisplay.AppendText("Port: " + i.ToString() + " is open." + Environment.NewLine);
        else txtDisplay.AppendText("Port: " + i.ToString() + " is closed." + Environment.NewLine);
    }
}

public static ManualResetEvent allDone = new ManualResetEvent(false);

public static void ConnectCallback(IAsyncResult ar)
{
    allDone.Set();

    using (TcpClient s = (TcpClient)ar.AsyncState)
    { }
}
...