2009-03-24 45 views

Trả lời

6

Bạn không thể xác định xem có cổng nào không. Bạn chỉ có thể xác định

  1. đó bạn có quyền kiểm soát của một cổng
  2. Đó một cổng đã có sẵn tại một số điểm trong quá khứ

Trừ khi bạn kiểm soát các cổng bằng việc có một ổ cắm đặc biệt ràng buộc và lắng nghe trên cổng, nó có thể cho một quá trình khác để đi cùng và kiểm soát của cảng.

Cách duy nhất đáng tin cậy để biết liệu cổng có sẵn là cố gắng lắng nghe trên đó hay không. Nếu bạn thành công thì cổng có sẵn và bạn có quyền kiểm soát. Nếu không, bạn biết rằng tại một số thời điểm trong quá khứ và có khả năng hiện tại, cảng đã được kiểm soát bởi một pháp nhân khác.

1

Đối với In C#, how to check if a TCP port is available?, tôi nghĩ rằng áp phích ban đầu không thực sự chắc chắn nếu anh ấy nói về khách hàng hoặc máy chủ, vì vậy cũng có câu trả lời là về khách hàng muốn kết nối hoặc máy chủ muốn nghe trên cổng.

Câu trả lời của JaredPar là chính xác (nhiều hơn thế này!) Mặc dù đôi khi có thể bất tiện.

Nếu bạn là hợp lý chắc chắn rằng không có máy chủ khác đang grabbing các cổng mà bạn chỉ cần kiểm tra (hoặc không quan tâm cho sự thất bại thỉnh thoảng), bạn có thể thử (từ http://www.codeproject.com/Tips/268108/Find-the-open-port-on-a-machine-using-Csharp?msg=4176410#xx4176410xx, tương tự như https://stackoverflow.com/a/570461/586754):

public static int GetOpenPort(int startPort = 2555) 
{ 
    int portStartIndex = startPort; 
    int count = 99; 
    IPGlobalProperties properties = IPGlobalProperties.GetIPGlobalProperties(); 
    IPEndPoint[] tcpEndPoints = properties.GetActiveTcpListeners(); 

    List<int> usedPorts = tcpEndPoints.Select(p => p.Port).ToList<int>(); 
    int unusedPort = 0; 

    unusedPort = Enumerable.Range(portStartIndex, 99).Where(port => !usedPorts.Contains(port)).FirstOrDefault(); 
    return unusedPort; 
} 
Các vấn đề liên quan