#c_sharp
Как узнать какие порты открыты на моем девайсе, программным методом C#
Ответы
Ответ 1
Способы проверки портов попытками коннекта могут быть ненадежными или занимать слишком много времени, особенно при проверке нескольких портов. К тому же, приложения могут слушать только определенные ip-адреса, и не слушать при этом 127.0.0.1, что приведет к негативному результату при попытке подключения. В C# есть стандартный способ получения списка активных TCP Listners: System.Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties() .GetActiveTcpListeners(); Работает достаточно быстро, результат можно отфильтровать по нужному порту / ip. var isPortBusy = System.Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties() .GetActiveTcpListeners().Any(l => l.Port == 80);Ответ 2
Как вариант прозвонить в диапазоне от IPEndPoint.MinPort до IPEndPoint.MaxPort. По идее, это займет очень много времени... Функция проверки открыт ли порт: public bool CheckIfPortIsOpen(int port) { try { using (var tcpClient = new TcpClient()) { tcpClient.Connect("127.0.0.1", port); return true; } } catch (SocketException) { return false; } } Советую обернуть метод в таску, ибо он может быть продолжительным. Думаю, если за секунд 5 коннекшн не установился, то и смысла нет ждать. Поэтому могу предложить следующую реализацию: public async TaskCheckIfPortIsOpenAsync(int port) { var connectTask = Task.Run(() => { try { using (var tcpClient = new TcpClient()) { tcpClient.Connect("127.0.0.1", port); return true; } } catch (SocketException) { return false; } }); var timeoutTask = Task.Delay(5 * 1000); var firstFinishedTask = await Task.WhenAny(connectTask, timeoutTask); return firstFinishedTask == connectTask ? connectTask.Result : false; }
Комментариев нет:
Отправить комментарий