c # Sure Fire - способ определения использования порта - PullRequest
2 голосов
/ 23 июня 2010

Обсуждаю это недавно.Попытка подключить SSH-туннель от локального порта на моей машине к внутреннему порту на другой стороне доступного через Интернет SSH-сервера с помощью Putty.Putty не проверяет, доступен ли порт.Прежде чем открывать соединение Putty, я хотел бы убедиться, что порт свободен.

Он работает нормально, если порт доступен, но мне нужен надежный пожарный способ, чтобы гарантировать, что порт не открыт в то время, когда япроверьте это в моем коде.Я использовал различные методы с плохими результатами.В настоящее время я использую следующий код:

    bool IsBusy(int port)
    {
        IPGlobalProperties ipGP = IPGlobalProperties.GetIPGlobalProperties();
        IPEndPoint[] endpoints = ipGP.GetActiveTcpListeners();
        if (endpoints == null || endpoints.Length == 0) return false;
        for (int i = 0; i < endpoints.Length; i++)
            if (endpoints[i].Port == port)
                return true;
        return false;
    }

У меня установлен uTorrent на компьютере.Когда я пытаюсь использовать порт 3390, происходит сбой, потому что uTorrent прослушивает этот порт через TCP.Есть ли способ убедиться, что TCP не используется на данном порту?

Ответы [ 2 ]

3 голосов
/ 23 июня 2010

Всегда будет состояние гонки, если вы проверяете с одной программой и ожидаете использовать порт в другой. Если вы делали все из одной программы, вы можете создать сокет и привязать его к порту 0, и система выберет для вас свободный порт, чтобы вы никогда не столкнулись с другим процессом.

1 голос
/ 03 июля 2010

Хорошо, учитывая, что вас не волнуют условия гонки.

Попробуйте связать () сокет () с портом с подстановочным IP-адресом (0.0.0.0).Если это удастся, ни у кого нет порта.(Конечно, теперь у вас есть порт, поэтому не забудьте закрыть его.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...