2015-06-26 15 views
7

Tôi muốn giải phóng một cổng TCP trong khi khởi động ứng dụng của tôi (yêu cầu xác nhận cho người dùng), cách lấy số PID và sau đó, nếu người dùng xác nhận, hãy xóa nó?Làm thế nào để tiêu diệt ứng dụng đang sử dụng cổng TCP trong C#?

Tôi biết tôi có thể lấy thông tin này bằng netstat, nhưng làm thế nào để làm điều đó trong một kịch bản hoặc tốt hơn trong một phương pháp C#.

+0

Điều gì xảy ra khi ứng dụng đó được cập nhật để phát hiện ứng dụng của bạn bắt đầu và xóa ứng dụng? Nếu bạn * phải * có một cổng cụ thể, nhưng nó đang được sử dụng, hãy thông báo cho người dùng về những ứng dụng/dịch vụ khác đang sử dụng nó nhưng để nó cho * người dùng * để giải quyết vấn đề. –

+0

@Damien_The_Unbeliever Tôi hiểu và đồng ý nhận xét của bạn, nhưng đây là một ứng dụng kinh doanh quan trọng đối với một POS với máy chủ web (cổng tcp 80). Ví dụ nếu Skype đang chạy, ứng dụng POS này sẽ không bắt đầu. Tôi có thể yêu cầu người dùng ngừng sử dụng skype để không sử dụng cổng 80, nhưng tôi nghĩ trong trường hợp này tốt hơn là nên cho anh ta một lối tắt. Có lẽ câu trả lời đúng là: "Người dùng không nên cài đặt các ứng dụng xung đột" ... nhưng tôi không thể kiểm soát được chúng! – Tobia

Trả lời

5

Bạn có thể chạy netstat rồi chuyển hướng đầu ra sang luồng văn bản để bạn có thể phân tích cú pháp và nhận thông tin mình muốn.

Đây là những gì tôi đã làm.

  • Run netstat -a -n -o là một quá trình
  • chuyển hướng tiêu chuẩn đặt ra và nắm bắt được văn bản đầu ra
  • chụp kết quả, phân tích và trả lại tất cả các quá trình sử dụng
  • kiểm tra nếu cổng đã được sử dụng
  • tìm thấy quá trình sử dụng linq
  • Run Process.Kill()

bạn sẽ phải thực hiện xử lý ngoại lệ.

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

Cảm ơn, tôi sẽ cố gắng! – Tobia

Các vấn đề liên quan