0

ThreadPoolでc#(私の同様のテーマはJavaに関するものでした)を使用してリモートPCのポートをチェックするプログラムを作成する必要があります。ポートの数は異なる場合があります。スレッド数 - 手動で設定できます (私は 5 を使用します)。

問題は、エラーがあることです A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond XX.XXX.XX.XX:80

ここで、このタスクのコード

private static int BEGIN = 75; //1
private static int END = 100; //65535
private static string host = "microsoft.com";
public static void concurrent()
    {
        ThreadPool.SetMaxThreads(5, 5);
        Stopwatch p = new Stopwatch();
        p.Start();

        for (int i = BEGIN; i <= END; i++)
        {
            ThreadPool.QueueUserWorkItem(new WaitCallback(check), i);
        }
        p.Stop();
        Console.WriteLine("Time with concurrency {0}", p.Elapsed);
    }

    private static void check(object o)
    {
        Console.WriteLine("Thread {0} checks port {1}", Thread.CurrentThread.GetHashCode(), (int)o);
        Lab1.makeTCP((int)o);
        //Thread.Sleep(1000);
    }

private static void makeTCP(int port)
    {
        IPAddress ipadr = Dns.GetHostAddresses(host)[0];

        try
        {
            Socket sock = new Socket(AddressFamily.InterNetwork, 
                                        SocketType.Stream, 
                                        ProtocolType.Tcp);
            sock.Connect(ipadr, port);
            if (sock.Connected)
                Console.WriteLine("Port {0} is closed", port);
            sock.Close();

            return;
        }
        catch (SocketException exc)
        {
            if (exc.ErrorCode == 10061)
                Console.WriteLine("Port {0} is open", port);
            else Console.WriteLine(exc.Message);
        }
    }

また、このタスクを実行するのに必要な時間を見つける方法も知りたいです。しかし、Stopwatch stopすべてのスレッドが完了するよりも早く発火します。この問題を解決するには?

4

0 に答える 0