1

ポートをスキャンし、ポートが開いているかどうかを確認し、スレッドプールを使用して練習する小さなアプリを実行しようとしています。コンソール ウィンドウは番号を尋ね、ポートを 1 から X までスキャンし、各ポートが開いているか閉じているかを表示します。私の問題は、各ポートを通過するときに途中で停止することがあることです。1つの数字にとどまらず、かなりランダムです。たとえば、200 を指定します。コンソールは各ポートをスクロールし、110 で停止します。次に実行すると、80 で停止します。

コード いくつかのことを省きます。すべての変数が宣言されるべき場所で宣言されていると仮定します。最初の部分はメインです。

static void Main(string[] args)
    {
        string portNum;
        int convertedNum;
        Console.WriteLine("Scanning ports 1-X");
        portNum = Console.ReadLine();
        convertedNum = Convert.ToInt32(portNum);
        try
        {
            for (int i = 1; i <= convertedNum; i++)
            {
                ThreadPool.QueueUserWorkItem(scanPort, i);
                Thread.Sleep(100);

            }
        }
        catch (Exception e)
        {
           Console.WriteLine("exception " + e);
        }
    }

    static void scanPort(object o)
    {
        TcpClient scanner = new TcpClient();
        try
        {
            scanner.Connect("127.0.0.1",(int)o);
            Console.WriteLine("Port {0} open", o);
        }
        catch
        {
            Console.WriteLine("Port {0} closed",o);
        }
    }

}
4

3 に答える 3

3

これがコード全体である場合、main()すべてのスレッド プール スレッドが終了するのを待たずに の最後まで失敗したためにエラーが発生した可能性があります。ThreadPoolメインスレッドがフォールスルー後に終了すると、スレッドはすべて中止されますmain()。を削除してみてくださいThread.Sleep(100)(必要ありません。これは間違った方法です。スリープする時間がわからず、ThreadPoolそもそも a を使用する目的を部分的に無効にします)。おそらく単一のポートをチェックすることさえありません!

代わりに、各ワーカー スレッドにイベントを設定させWaitAll、メインで使用してすべてのイベントを終了させることができます。例については、 http://msdn.microsoft.com/en-us/library/3dasc8as.aspxを参照してください。

編集: これを考えてみると、上記のリンクで参照されているソリューションは、おそらくあなたにとって理想的とは言えません(65000イベントの配列を割り当てる必要があるかもしれません。これは過剰です)。CountdownEvent.net 4 では、次のように使用できます。

申し訳ありませんが、実行する必要がありますが、この例を確認してください http://msdn.microsoft.com/en-us/library/system.threading.countdownevent.aspxさらに質問がある場合はお知らせください。より良い解決策と.net3により適した解決策を詳しく説明または提案します

于 2010-06-11T19:01:40.237 に答える
0

何のOS?XP のさまざまなバージョンには tcp 接続制限があることを忘れないでください。また、アンチ DDOS 保護もトリガーしている可能性があります。

また、あなたの論理には欠陥があります。TcpClient.Connect が除外されたからといって、ポートが閉じているわけではありません。その例外の詳細をキャプチャして表示する必要があるため、コードが停止している理由についてより深い洞察が得られると思います。SocketException または SecurityException もスローする可能性があることに注意してください。

于 2010-06-11T19:41:36.647 に答える
0

スレッド部分に関しては、ThreadPool に直接アクセスする代わりに、Task Parallel Library (TPL) を使用することを検討できます。私見は、より簡単な使用と、より直感的で読みやすい構文を提供します。

于 2010-06-11T20:30:02.797 に答える