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;
}
}
}
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. –
@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