2015-06-26 8 views
7

Voglio liberare una porta TCP durante l'avvio della mia applicazione (chiedendo conferma all'utente), come ottenere il numero PID e poi, se l'utente conferma, ucciderlo?Come uccidere l'applicazione che sta utilizzando una porta TCP in C#?

So che posso ottenere queste informazioni da netstat, ma come farlo in uno script o meglio in un metodo C#.

+0

Cosa succede quando l'applicazione viene aggiornata per rilevare l'avvio e l'arresto dell'applicazione? Se * è necessario * avere una porta specifica, ma è in uso, informare l'utente di quale altra applicazione/servizio lo sta utilizzando, ma lasciarlo all'utente * * per risolvere il problema. –

+0

@Damien_The_Unbeliever Capisco e accetto il tuo commento, ma questa è un'applicazione business-critical per un POS con un server web (tcp 80 port). Ad esempio, se Skype è in esecuzione, questa applicazione POS non verrà avviata. Potrei dire all'utente di smettere di skype di impostarlo per non usare la porta 80, ma penso che in questo caso è meglio dargli una scorciatoia. Forse la risposta corretta è: "L'utente non dovrebbe installare appliactions in conflitto" ... ma non posso controllarli! – Tobia

risposta

5

È possibile eseguire netstat quindi reindirizzare l'output su un flusso di testo in modo da poter analizzare e ottenere le informazioni desiderate.

Ecco cosa ho fatto.

  • Run netstat -a -n -o come processo
  • reindirizzare lo standard mettere fuori e catturare il testo di uscita
  • cattura il risultato, analizzare e restituire tutti i processi in uso
  • verifica se la porta è in uso
  • trovare il processo utilizzando linq
  • Run Process.Kill()

si dovrà fare la gestione delle eccezioni.

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

Grazie, ci proverò! – Tobia

Problemi correlati