2015-06-26 20 views
7

Uygulamamın başlatılması sırasında (kullanıcı onayı isteniyor), PID numarasının nasıl alınacağı ve ardından kullanıcı onayladıysa öldürmesi için bir TCP bağlantı noktası açmak istiyorum.C# içinde bir TCP bağlantı noktası kullanan uygulamayı nasıl öldürebilirim?

Bu bilgiyi netstat ile alabildiğimi biliyorum, ancak bir komut dosyasında veya C# yönteminde nasıl daha iyi yapılabileceğini biliyorum.

+0

Uygulamanızın başlatıldığını algılamak ve öldürmek için bu uygulama güncellendiğinde ne olur? * Belirli bir bağlantı noktasına sahip olmanız gerekir, ancak kullanımda ise, başka bir uygulama/hizmetin kullandığı kullanıcıyı bilgilendirin, ancak sorunu çözmek için * kullanıcı * 'ya bırakın. –

+0

@Damien_The_Unbeliever Yorumunuzu anlıyor ve kabul ediyorum, ancak bu bir web sunucusu (tcp 80 portu) ile POS için kritik bir uygulama. Örneğin, Skype çalışıyorsa, bu POS uygulaması başlatılmayacaktır. Kullanıcıya 80 portu kullanmamasını sağlamak için skype'ı durdurmasını söyleyebilirim, ama bence bu durumda ona bir kısayol vermek daha iyi. Belki de doğru cevap: "Kullanıcı çelişen uygulamaları yüklememeli" ... ama onları kontrol edemiyorum! – Tobia

cevap

5

netstat'ı çalıştırabilir, daha sonra çıktıyı bir metin akışına yönlendirebilirsiniz, böylece istediğiniz bilgiyi ayrıştırıp alabilirsiniz.

İşte yaptığım şey. Bir Süreci

  • olarak

    • Run netstat -a -n -o koymak standardını dışarı yönlendirmek ve çıkış metni
    • yakalama sonucu yakalamak, ayrıştırmak ve port
    • kullanılıyorsa kullanımda
    • çek tüm işlemleri dönmek
    • kullanarak işlemi bulmak linq
    • Run Process.Kill()

    İstisna işlemi yapmanız gerekir.

    namespace test 
    { 
         static class Program 
         { 
          /// <summary> 
          /// The main entry point for the application. 
          /// </summary> 
    
          static void Main() 
          { 
    
           Console.WriteLine("Port number you want to clear"); 
           var input = Console.ReadLine(); 
           //var port = int.Parse(input); 
           var prc = new ProcManager(); 
           prc.KillByPort(7972); 
    
          } 
         } 
    
    
    
        public class PRC 
        { 
          public int PID { get; set; } 
          public int Port { get; set; } 
          public string Protocol { get; set; } 
        } 
         public class ProcManager 
         { 
          public void KillByPort(int port) 
          { 
           var processes = GetAllProcesses(); 
           if (processes.Any(p => p.Port == port)) 
           try{ 
            Process.GetProcessById(processes.First(p => p.Port == port).PID).Kill(); 
            } 
           catch(Exception ex) 
           { 
            Console.WriteLine(ex.Message); 
           } 
           else 
           { 
            Console.WriteLine("No process to kill!"); 
           } 
          } 
    
          public List<PRC> GetAllProcesses() 
          { 
           var pStartInfo = new ProcessStartInfo(); 
           pStartInfo.FileName = "netstat.exe"; 
           pStartInfo.Arguments = "-a -n -o"; 
           pStartInfo.WindowStyle = ProcessWindowStyle.Maximized; 
           pStartInfo.UseShellExecute = false; 
           pStartInfo.RedirectStandardInput = true; 
           pStartInfo.RedirectStandardOutput = true; 
           pStartInfo.RedirectStandardError = true; 
    
           var process = new Process() 
           { 
            StartInfo = pStartInfo 
           }; 
           process.Start(); 
    
           var soStream = process.StandardOutput; 
    
           var output = soStream.ReadToEnd(); 
           if(process.ExitCode != 0) 
            throw new Exception("somethign broke"); 
    
           var result = new List<PRC>(); 
    
           var lines = Regex.Split(output, "\r\n"); 
           foreach (var line in lines) 
           { 
            if(line.Trim().StartsWith("Proto")) 
             continue; 
    
            var parts = line.Split(new char[]{' '}, StringSplitOptions.RemoveEmptyEntries); 
    
            var len = parts.Length; 
            if(len > 2) 
             result.Add(new PRC 
             { 
              Protocol = parts[0], 
              Port = int.Parse(parts[1].Split(':').Last()), 
              PID = int.Parse(parts[len - 1]) 
             }); 
    
    
           } 
           return result; 
          } 
         } 
    } 
    
  • +0

    Teşekkürler, bunu deneyeceğim! – Tobia

    İlgili konular