2015-06-26 24 views
7

Ich möchte einen TCP-Port während des Starts meiner Anwendung freigeben (Frage Bestätigung für Benutzer), wie die PID-Nummer erhalten und dann, wenn der Benutzer bestätigen, töten Sie es?Wie wird die Anwendung beendet, die einen TCP-Port in C# verwendet?

Ich weiß, dass ich diese Informationen von Netstat erhalten kann, aber wie man es in einem Skript oder besser in einer C# -Methode macht.

+0

Was passiert, wenn diese Anwendung aktualisiert wird, um zu erkennen, dass Ihre Anwendung gestartet und beendet wird? Wenn Sie * einen * spezifischen Port haben müssen, aber in Verwendung sind, informieren Sie den Benutzer darüber, welche andere Anwendung/Dienst sie verwendet, aber überlassen Sie ihn dem * Benutzer *, um das Problem zu beheben. –

+0

@Damien_The_Unbeliever Ich verstehe und stimme Ihrem Kommentar zu, aber dies ist eine geschäftskritische Anwendung für ein POS mit einem Webserver (TCP 80 Port). Wenn Skype beispielsweise ausgeführt wird, wird diese POS-Anwendung nicht gestartet. Ich könnte dem Benutzer sagen, skype zu stoppen, damit er den Port 80 nicht benutzt, aber ich denke, in diesem Fall ist es besser, ihm eine Abkürzung zu geben. Vielleicht lautet die richtige Antwort: "Der Benutzer sollte keine widersprüchlichen Anwendungen installieren" ... aber ich kann sie nicht kontrollieren! – Tobia

Antwort

5

Sie können Netstat ausführen und dann die Ausgabe in einen Textstream umleiten, so dass Sie die gewünschten Informationen parsen und abrufen können.

Hier ist was ich getan habe.

  • Run netstat -a -n -o als Prozess
  • den Standard Umleitung aus dem Ausgabetext
  • capture das Ergebnis setzen und erfassen, analysieren und das Rück all Prozesse in Gebrauch
  • Prüfen, ob die Port
  • benutzt wird
  • finden den Prozess linq
  • Run Process.Kill()
mit 210

müssen Sie die Ausnahmebehandlung durchführen.

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

Danke, ich werde das versuchen! – Tobia