Результаты сканирования портов кажутся неверными при использовании AsyncCallback - PullRequest
0 голосов
/ 26 января 2012

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

Я пытаюсь использовать асинхронный TCPClient для сканирования портов.

Что здесь может быть не так? Я что-то пропустил?

private void btnStart_Click(object sender, EventArgs e)
{
    for (int port = 80; port < 100; port++)
    {
        ScanPort(port);
    }
}

private void ScanPort(int port)
{
    using (TcpClient client = new TcpClient())
    {
        client.BeginConnect(IPAddress.Parse("74.125.226.84"), port, new AsyncCallback(CallBack), client);
    }
}

private void CallBack(IAsyncResult result)
{
    using (TcpClient client = (TcpClient)result.AsyncState)
    {
        try
        {
            this.Invoke((MethodInvoker)delegate
            {
                txtDisplay.Text += "open" + Environment.NewLine;
            });
        }
        catch
        {
            this.Invoke((MethodInvoker)delegate
            {
                txtDisplay.Text += "closed" + Environment.NewLine;
            });
        }
    }
}

Это то, что я сейчас использую как метод CallBack:

    private void CallBack(IAsyncResult result)
    {
        using (TcpClient client = (TcpClient)result.AsyncState)
        {
            client.EndConnect(result);

            if (client.Connected)
            {
                this.Invoke((MethodInvoker)delegate
                {
                    txtDisplay.Text += "open" + Environment.NewLine;
                });
            }
            else
            {
                this.Invoke((MethodInvoker)delegate
                {
                    txtDisplay.Text += "closed" + Environment.NewLine;
                });
            }
        }
    }

1 Ответ

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

утверждение:

using (TcpClient client = new TcpClient())
{
    client.BeginConnect(IPAddress.Parse("74.125.226.84"), port, new AsyncCallback(CallBack), client);
}

Создает новый TcpClient, затем вызывает BeginConnect, а затем немедленно удаляет клиента до достижения обратного вызова. Имейте в виду, что метод BeginConnect не блокирует. Утилизация клиента должна происходить только при обратном вызове, поэтому метод ScanPort должен выглядеть так:

private void ScanPort(int port)
{
    var client = new TcpClient();
    try {
        client.BeginConnect(IPAddress.Parse("74.125.226.84"), port, new AsyncCallback(CallBack), client);
    } catch (SocketException) {
        ...
        client.Close();
    }
}

При обратном вызове вы также должны позвонить EndConnect :

using (TcpClient client = (TcpClient)result.AsyncState)
{
    try
    {
        client.EndConnect(result);
        this.Invoke((MethodInvoker)delegate
        {
            txtDisplay.Text += "open" + Environment.NewLine;
        });
    }
    catch
    {
        this.Invoke((MethodInvoker)delegate
        {
            txtDisplay.Text += "closed" + Environment.NewLine;
        });
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...