Ejemplo n.º 1
0
        static int Main(string[] args)
        {
            try
            {
                Parameter parameter = new Parameter(args);
                if (parameter.IsHelp == true)
                {
                    Console.WriteLine("manコマンドでspingのヘルプを参照して下さい。");
                    return 1;
                }
                #region Timeoutの設定
                SPing.Properties.Settings setting = new SPing.Properties.Settings();
                if (setting.TimeOut != 0)
                    _timeOut = setting.TimeOut;

                if (parameter.TimeOut != 0)
                    _timeOut = parameter.TimeOut;

                if (parameter.EchoCount != 0)
                    _echoCount = parameter.EchoCount;

                #endregion

                #region パラメータの最大スレッド数だけThreadをプールします。ただし、最大スレッド数は、256個
                //デフォルトは、250、1000⇒32bitだから?少ない?
                if (parameter.MaxThreads != 0)
                    ThreadPool.SetMaxThreads(parameter.MaxThreads, parameter.CompletionPortThreads);

                #endregion

                InitUpdateAddress();

                parameter.ArgumentsExceptOptions.All(arg =>
                {
                    string key = arg.IndexOf(",") >= 0 ? arg.Substring(0, arg.IndexOf(",")) : arg;
                    string hostName = arg.IndexOf(",") >= 0 ? arg.Substring(arg.IndexOf(",") + 1) : null;
                    if (_pingResult.ContainsKey(key) == true)
                    {
                        return true;
                    }
                    else
                    {
                        key = UpdateAddress(key);
                        PingResult pr = new PingResult();
                        pr.HostName = hostName;
                        _pingResult.Add(key, pr);

                        return true;
                    }
                });

                //pingの実行
                _pingResult.All(dic => { ThreadPool.QueueUserWorkItem(new WaitCallback(_Ping), dic); return true; });

                //結果の取得
                if (parameter.IsErrorOnly == true)
                {
                    //全てのチェックを終えてからエラーのみをフィルタする。
                    _pingResult.All(dic => { dic.Value.AutoResetEvent.WaitOne(); return true; });

                    //エラーの実を絞ってクエリ抽出
                    var pingResult = from ret in _pingResult where ret.Value.Exception != null || ret.Value.PingReply.Status != IPStatus.Success select ret;

                    //表示
                    return _ShowResult(pingResult, parameter, false);
                }
                else
                {
                    //結果はパラメータ順に表示する。
                    return _ShowResult(_pingResult, parameter, true);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.GetAllMessage());
                return 1;
            }
        }
Ejemplo n.º 2
0
        static int Main(string[] args)
        {
            try
            {
                Parameter parameter = new Parameter(args);
                if (parameter.IsHelp == true)
                {
                    Console.WriteLine("manコマンドでspingのヘルプを参照して下さい。");
                    return(1);
                }
                #region Timeoutの設定
                SPing.Properties.Settings setting = new SPing.Properties.Settings();
                if (setting.TimeOut != 0)
                {
                    _timeOut = setting.TimeOut;
                }

                if (parameter.TimeOut != 0)
                {
                    _timeOut = parameter.TimeOut;
                }

                if (parameter.EchoCount != 0)
                {
                    _echoCount = parameter.EchoCount;
                }


                #endregion

                #region パラメータの最大スレッド数だけThreadをプールします。ただし、最大スレッド数は、256個
                //デフォルトは、250、1000⇒32bitだから?少ない?
                if (parameter.MaxThreads != 0)
                {
                    ThreadPool.SetMaxThreads(parameter.MaxThreads, parameter.CompletionPortThreads);
                }

                #endregion

                InitUpdateAddress();

                parameter.ArgumentsExceptOptions.All(arg =>
                {
                    string key      = arg.IndexOf(",") >= 0 ? arg.Substring(0, arg.IndexOf(",")) : arg;
                    string hostName = arg.IndexOf(",") >= 0 ? arg.Substring(arg.IndexOf(",") + 1) : null;
                    if (_pingResult.ContainsKey(key) == true)
                    {
                        return(true);
                    }
                    else
                    {
                        key           = UpdateAddress(key);
                        PingResult pr = new PingResult {
                            HostName = hostName
                        };
                        _pingResult.Add(key, pr);

                        return(true);
                    }
                });

                //pingの実行
                _pingResult.All(dic => { ThreadPool.QueueUserWorkItem(new WaitCallback(_Ping), dic); return(true); });

                //結果の取得
                if (parameter.IsErrorOnly == true)
                {
                    //全てのチェックを終えてからエラーのみをフィルタする。
                    _pingResult.All(dic => { dic.Value.AutoResetEvent.WaitOne(); return(true); });

                    //エラーの実を絞ってクエリ抽出
                    var pingResult = from ret in _pingResult where ret.Value.Exception != null || ret.Value.PingReply.Status != IPStatus.Success select ret;

                    //表示
                    return(_ShowResult(pingResult, parameter, false));
                }
                else
                {
                    //結果はパラメータ順に表示する。
                    return(_ShowResult(_pingResult, parameter, true));
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.GetAllMessage());
                return(1);
            }
        }