2017-08-22 15 views
0

私のプログラムでは、ネットワーク内のすべてのアドレスをx.x.x.1からx.x.x.255にスキャン(ping)します。私はうまく動作するが、プログラムから実行に失敗したcmdでコマンドをテストしました。実行中にコマンドラインfor-loopを一時停止

私は自分のプログラムがウィンドウを作成できるように設定し、コマンドが終了してもそれを維持します。プロセスがしばらく働いて、x.x.x.1からx.x.x.18にpingして、それがつまってしまいます。私は手動でx.x.x.18にpingを試みてこのアドレスのための特別なものを見ました...まだ特別なものはありません。x.x.x.2からx.x.x.17までと同じ空いているアドレスです。

誰でも問題を診断できますか?ありがとうございました!

public void PingAllAddressInVirtualNetwork() { 
    string hotspotAddress = GetHotspotDefaultAddress(); 
    string cmd = "/k \"for /l %i in (1,1,255) do ping " + hotspotAddress.Substring (0, hotspotAddress.Length - 1) + "%i -n 1 -w 15\""; 
    UnityEngine.Debug.Log ("cmd = "+cmd); 
    ProcessStartInfo processStartInfo = new ProcessStartInfo("cmd.exe", cmd); 
    processStartInfo.RedirectStandardOutput = true; 
    //processStartInfo.CreateNoWindow = true; 
    //processStartInfo.WindowStyle = ProcessWindowStyle.Hidden; 
    processStartInfo.UseShellExecute = false; 
    processStartInfo.StandardOutputEncoding = Encoding.Default; 

    Process process = Process.Start (processStartInfo); 
    if (process != null) { 
     process.WaitForExit(); 
     UnityEngine.Debug.Log ("ping address (scanning) finished."); 
    } 
} 
+3

から次の255 IPにpingを実行します:なぜドン[System.Net.NetworkInformation.Ping](https://msdn.microsoft.com/en-us/library/system.net.networkinformation.ping(v = vs.110).aspx)を使用していませんか? – Fildor

+0

問題について:StandardErrorもリダイレクトできますか?そして、ReturnCodeが何であるか見てみてくださいが、ブロックするだけの方が便利だとは思っていません。 – Fildor

答えて

1
using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Diagnostics; 
using System.Linq; 
using System.Net; 
using System.Net.NetworkInformation; 
using System.Text; 
using System.Threading; 
using System.Threading.Tasks; 

class IPPing 
{ 
    /// <summary> 
    /// Ping List 
    /// </summary> 
    private static List<Ping> m_PingList = new List<Ping>(); 

    /// <summary> 
    /// used like event Handler count 
    /// </summary> 
    private static int m_nInstance = 0; 

    /// <summary> 
    /// Lock 
    /// </summary> 
    private static object @lock = new object(); 

    /// <summary> 
    /// IpAddress 
    /// </summary> 
    private static IPAddress IpAddress { get; set; } 

    /// <summary> 
    /// Number of ip to check 
    /// </summary> 
    private static int NumberOfIp { get; set; } 

    /// <summary> 
    /// IpList 
    /// </summary> 
    private static List<IPAddress> IpList { get; set; } 

    /// <summary> 
    /// Constructor 
    /// </summary> 
    /// <param name="nNumberOfIp">Number of ip to check</param> 
    /// <param name="StartIp">Start ip</param> 
    public IPPing(int nNumberOfIp, IPAddress StartIp) 
    { 
     NumberOfIp = nNumberOfIp; 
     IpAddress = StartIp; 
     IpList = new List<IPAddress>(); 
    } 

    public List<IPAddress> StartPing() 
    { 
     // Create ping request 
     CreatePingers(NumberOfIp); 

     PingOptions pingOption = new PingOptions(1, true); 
     ASCIIEncoding encoding = new ASCIIEncoding(); 
     byte[] data = encoding.GetBytes(""); 

     // Used to wait thread for ping request to finished 
     SpinWait wait = new SpinWait(); 

     // Send all ping Async 
     foreach (Ping ping in m_PingList) 
     { 
      lock (@lock) 
      { 
       m_nInstance += 1; 
      } 
      string sasd = IpAddress.ToString(); 
      ping.SendAsync(IpAddress.ToString(), 250, data, pingOption); 
      IpAddress = GetNextIp(IpAddress); 
     } 

     // wait still all Pin_Completed finished 
     while (m_nInstance > 0) 
     { 
      wait.SpinOnce(); 
     } 
     DestroyPingers(); 
     return IpList; 
    } 

    /// <summary> 
    /// Event is called when ping reqest finished 
    /// </summary> 
    /// <param name="obj">object</param> 
    /// <param name="e">Ping Completed Event Args</param> 
    public static void Ping_completed(object obj, PingCompletedEventArgs e) 
    { 
     lock (@lock) 
     { 
      m_nInstance -= 1; 
     } 

     if (e.Reply.Status == IPStatus.Success) 
     { 
      IpList.Add(e.Reply.Address);    
     } 
    } 

    /// <summary> 
    /// Used to create ping request 
    /// </summary> 
    /// <param name="nNumberOfPingRequest">Number of ping request</param> 
    public static void CreatePingers(int nNumberOfPingRequest) 
    { 
     for (int i = 1; i <= nNumberOfPingRequest; i++) 
     { 
      Ping ping = new Ping(); 

      // Attached event to ping request 
      ping.PingCompleted += Ping_completed; 
      m_PingList.Add(ping); 
     } 
    } 

    /// <summary> 
    /// Used to destroy ping requestes 
    /// </summary> 
    public static void DestroyPingers() 
    { 
     foreach (Ping ping in m_PingList) 
     { 
      // Detach event 
      ping.PingCompleted -= Ping_completed; 
      ping.Dispose(); 
     } 
     m_PingList.Clear(); 
    } 


    /// <summary> 
    /// Get next ip 
    /// </summary> 
    /// <param name="Ip">Ip address</param> 
    /// <returns>Next ip</returns> 
    public static IPAddress GetNextIp(IPAddress Ip) 
    { 
     byte[] barrIP = Ip.ToString().Split('.').Select(byte.Parse).ToArray(); 

     if (++barrIP[3] == 0) 
     { 
      if (++barrIP[2] == 0) 
      { 
       if (++barrIP[1] == 0) 
       { 
        ++barrIP[0]; 
       } 
      } 
     } 
     return new IPAddress(barrIP); 
    } 
} 

これは、すべてのIPにpingを実行するのに役立ちますし、より高速なIPにpingを実行します。ここでは、開始IPとあなたが

使い方をpingしたいIPアドレスの数を与えることができます:

IPAddress IpAddress = IPAddress.Parse("199.199.199.0"); 
IPPing objIP = new IPPing(255,IpAddress); 
List<IPAddress> IpList= objIP.StartPing(); 

これはないあなたの問題を解決が、199.199.199.0

+0

"私はWindowsに問題があります。" - "Linuxを使う" ...おかしい。手元にある問題の解決策ではありません。はい、それはおそらく仕事であることをするでしょう。しかし、問題は、OPのソリューションが、それをどうやって違う方法ではなく、誤った動作を示すのかということです。だからこそ私はなぜ彼が_comment_でPingを使用していないのか尋ねました。 – Fildor

+0

OPとして@Fildorが言った "プロセスがしばらくの間働く"ので、Pingを使用すると、より速いpingを得るのが最善である – Blue

+0

私は同意するが、OPのコードが "動作を停止"する理由はまだわからない... – Fildor

関連する問題