2017-03-20 50 views
24

Bu kodu kullanıyorum sonunda istatistikleri almak ama süreci durdurmak zaman ping istatistikleri almak değil:Nasıl System.Diagnostics.Process bir süreci durdurmak ve

kullanmadan

System.Diagnostics.Process p = new System.Diagnostics.Process(); 
p.StartInfo.FileName = "ping"; 
p.StartInfo.Arguments = "-c " + count + " -i " + interval + " -s " + buffer + " -W " + timeout + " " + address; 
p.StartInfo.UseShellExecute = false; 
p.StartInfo.RedirectStandardOutput = true; 

string readData = ""; 

DateTime dt = DateTime.Now.AddSeconds(5); 
if (p.Start()) 
{ 
    Scanner scanner = new Scanner(p.StandardOutput.BaseStream); 

    while (scanner.HasNextLine) 
    { 
     readData = scanner.NextLine().ToString(); 
     Console.WriteLine(readData.ToString()); 

     if (!string.IsNullOrEmpty(readData) && !readData.StartsWith("---")) 
     { 
      Match M = Regex.Match(readData, @"^[\d]+ bytes from ([^:]+): [^ ]+ ttl=([\d]+) time=([^ ]+) ms"); 

      if (M != null && M.Success) 
      { 
       string IP = M.Groups[1].Value; 
       string TTL = M.Groups[2].Value; 
       string timeStr = M.Groups[3].Value; 

       Console.WriteLine(String.Format("Ping to {0} took {2} ms with a ttl of {1}", IP, TTL, timeStr)); 
       // Parsing the timeStr will work the same way as above 
       if(dt > DateTime.Now) 
       { 
        p.StandartInput.Write("\x3"); 
       } 
      } 
      else 
      { 
       Match M1 = Regex.Match(readData, @"^rtt [^0-9]*([\d][^\/]+)\/([^\/]+)\/([^\/]+)\/([^ ]+) ms$"); 

       if (M1 != null && M1.Success) 
       { 
        float avgPingTime = 0; 
        float maxPingTime = 0; 
        float minPingTime = 0; 

        string minPingString = M1.Groups[1].Value; 
        string avgPingString = M1.Groups[2].Value; 
        string maxPingString = M1.Groups[3].Value; 

        // Now parse that value 
        float.TryParse(minPingString, System.Globalization.NumberStyles.Float, System.Globalization.NumberFormatInfo.InvariantInfo, out minPingTime); 
        float.TryParse(avgPingString, System.Globalization.NumberStyles.Float, System.Globalization.NumberFormatInfo.InvariantInfo, out avgPingTime); 
        float.TryParse(maxPingString, System.Globalization.NumberStyles.Float, System.Globalization.NumberFormatInfo.InvariantInfo, out maxPingTime); 

        Console.WriteLine(String.Format("Min Time : {0} , AVG {2} ms, Max Time {1}", minPingTime, maxPingTime, avgPingTime)); 
       } 
      } 
     } 
    } 
} 

böyle

if(dt > DateTime.Now) 
{ 
    p.StandartInput.Write("\x3"); 
} 

sonuç ekranı:

64 bytes from 8.8.8.8: icmp_req=1 ttl=46 time=13.9 ms 
64 bytes from 8.8.8.8: icmp_req=2 ttl=46 time=13.9 ms 
64 bytes from 8.8.8.8: icmp_req=3 ttl=46 time=13.9 ms 

--- 8.8.8.8 ping statistics --- 
3 packets transmitted, 3 received, 0% packet loss, time 3016ms 
rtt min/avg/max/mdev = 13.910/13.926/13.951/0.010 ms 

ama durursak ping 012 kullanılarakhiçbir zaman statistics bölümüne gider, dizisi 1: 64 bytes from 8.8.8.8: icmp_req=1 ttl=46 time=13.9 ms sekansında asılı kalır ve okumaya devam etmeyin, işlemini durdurduktan sonra statistics nasıl gösterilir? Kullanıcı ping o ping için kullanılan belirli bir süre için statistics göstermesi gerekir durdurmak istediğinizde başka bir deyişle

benim sorunum

GÜNCELLEME ... Ben hayata geçirdik

olduğunu p.StandartInput.Write("/x3"); ve ping işlemini keser, ancak istatistikleri görüntülemez ve sadece orada asılı kalır.

+1

std giriş akışına bir 'Ctrl-C' yazın, '3', 'Yaz' ("\ x3") ' – SushiHangover

+0

' 'adb shell ping -c 3 denedim 8.8.8.8 'CTRL + C ile ama sadece imkansız bir şekilde durur, istatistik bölümünü göstermez ... –

+0

Sadece denedim ve istatistik satırları üretiyor ... çünkü 'adb' ile test ediyorsunuz, aslında ilk kabukta adb kabuğu 've sonra' ping 've sonra Ctrl-C' çalıştırın, siz ctrl-C/pb sürecini iptal etmeyin ping işlemi değil – SushiHangover

cevap

1

Ping değerleriyle ilgileniyorsanız, neden sadece ping sınıfını kullanmıyorsunuz? https://msdn.microsoft.com/en-us/library/system.net.networkinformation.ping(v=vs.110).aspx

+0

Android System'den ping, Mono Framework'den daha iyi olduğu için daha önce denedim ve MONO'da Round Trip Time'ın daha yüksek olduğunu fark ettim Sand Box nedeniyle .... Bu istisna olarak çalışmıyor! Ve IPStatus.TtlExpired'de bazı hatalar var. –

+0

Ping hızıyla ilgili endişeleriniz varsa, neden kendi ICMP hizmetinizi yazmıyorsunuz? Bu tür bir işlevi yerine getirmek için bir Linux sisteminde Tamam olabilir, ama bir mobil/Xamarin, bu sorununun doğru cevabı olduğundan emin değilim. – Neil

+0

neden kendi ICMP servisimi yazmalıyım? Ne demek istediğini anlamadım. Soru, std exec ile başlatıldıktan sonra işlemin nasıl durdurulacağıdır. –