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