6

TCP ポートを非同期的にスキャンしようとしています。開いているポートが完了するのに数百ミリ秒しかかからないので問題ありませんが、ポートが閉じられると、応答を待たなければなりません。

そのため、アプリを実行すると、すぐにポート 80 が開いていることがわかります。次に、他のすべてのポートがスキャンされるまで 30 分ほど待つ必要があります。

編集。さらに、他のポートがチェックされるのを待たずに、応答が発生したときに表示したいと思います。

これをより速くする方法は?

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

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

private void CallBack(IAsyncResult result)
{
    bool connected = false;

    using (TcpClient client = (TcpClient)result.AsyncState)
    {
        try
        {
            client.EndConnect(result);
            connected = client.Connected;
        }
        catch (SocketException)
        {
        }
    }

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

1 に答える 1

8

WaitHandle BeginConnect リターンを使用して、非常に長く待つことができます。

using (var tcp = new TcpClient())
{
    var ar = tcp.BeginConnect(host, port, null, null);
    using (ar.AsyncWaitHandle)
    {
        //Wait 2 seconds for connection.
        if (ar.AsyncWaitHandle.WaitOne(2000, false))
        {
            try
            {
                tcp.EndConnect(ar);
                //Connect was successful.
            }
            catch
            {
                //EndConnect threw an exception.
                //Most likely means the server refused the connection.
            }
        }
        else
        {
            //Connection timed out.
        }
    }
}
于 2012-01-26T21:04:08.590 に答える