Страницы

Поиск по вопросам

пятница, 31 января 2020 г.

Как узнать какие порты открыты на локальном компьютере?

#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 Task CheckIfPortIsOpenAsync(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; }

Комментариев нет:

Отправить комментарий