Вместо сканирования нескольких портов я сканирую только один, и когда порт закрыт, мое приложение закрывается - PullRequest
0 голосов
/ 26 января 2012

Я пытаюсь сканировать несколько портов одновременно, используя асинхронное сканирование.Проблема в том, что я могу отображать только первый рабочий порт, а затем ждать около 20 секунд, мое приложение закрывается, не сообщая мне, что порт закрыт.

Что может быть не так с этим кодом?

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

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();
    }
}

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

    client.EndConnect(result);

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

1 Ответ

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

В вашем методе обратного вызова я бы обязательно закрыл соединение и избавился от TcpClient. Также TcpClient.EndConnect (IAsyncResult) также может генерировать исключения. Я также не вижу, где происходит захват номера порта для отображения пользователю. Я написал бы обратный вызов примерно так.

Редактировать: я фактически не компилировал и не выполнял свой код (извините). Я также нашел эту другую статью, в которой показано, как создать сканер портов в C #, http://www.dijksterhuis.org/building-a-simple-portscanner-in-c/ В этом сообщении есть комментарий о том,

Здесь есть ошибка: .NET-реализация функции TCPClient.Close () фактически не закрывает соединение должным образом. Поэтому нам нужно выполнить дополнительные шаги, чтобы получить поток, представляющий соединение, и закрыть его, прежде чем вызывать TCPClient.Close.

private void CallBack(IAsyncResult result) 
{ 
    var client = (TcpClient)result.AsyncState; 
    bool connected = false;

    try
    {
        client.EndConnect(result);
        connected = client.Connected;
    }
    catch (SocketException)
    {
    }
    catch (ObjectDisposedException)
    {
    }
    finally
    {
        if (client.Connected)
        {
            client.Close();
        }

        client.Dispose();
    }

    if (connected) 
    { 
        this.Invoke((MethodInvoker)delegate 
        { 
            txtDisplay.Text += "open2" + Environment.NewLine; 
        }); 
    } 
    else 
    { 
        this.Invoke((MethodInvoker)delegate 
        { 
            txtDisplay.Text += "closed2" + Environment.NewLine; 
        }); 
    } 
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...