C # Определить использование локального порта - PullRequest
1 голос
/ 17 июня 2010

Заранее спасибо за ваш совет.

В настоящее время я работаю над программой, которая использует Putty для создания SSH-соединения с сервером, который использует локальную переадресацию портов для включения клиента, на котором запущено мое программное обеспечение,чтобы получить доступ к службе за сервером SSH через localhost.

IE: клиент: 20100 -> Интернет -> Удаленный сервер SSH, доступный через маршрутизатор / брандмауэр -> Локальная интрасеть -> Сервер интрасети Web POP3: 110.

Строка Cmd: "putty -ssh -2 -P 22 -C -L 20100: intranteIP: 110 -pw sshpassword sshusername @ sshserver"

Клиент будет использовать putty для создания соединения SSH сSSH-сервер, указывающий в строке подключения, что он хотел бы связать порт 110 POP3-сервера интрасети с портом 20100 в клиентской системе.Поэтому клиент сможет открыть почтовый клиент для localhost: 20100 и взаимодействовать с внутренним сервером POP3 через туннель SSH.Выше приведено общее описание.Я уже знаю, что то, что я пытаюсь сделать, будет работать без проблем, поэтому я не ищу дебатов по вышеуказанному.

Вопрос заключается в следующем ... Как я могу обеспечить локальный порт (я не могу использовать динамические порты, поэтому он должен быть статическим) на локальном хосте не используется или не прослушивается никаким другим приложением?

В настоящее время я выполняю этот код в своем приложении на C #:

private bool checkPort(int port)
{
    try
    {
        //Create a socket on the current IPv4 address
        Socket TestSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

        // Create an IP end point
        IPEndPoint localIP = new IPEndPoint(IPAddress.Parse("127.0.0.1"), port);

        // Bind that port
        TestSocket.Bind(localIP);

        // Cleanup
        TestSocket.Close();

        return false;
    }
    catch (Exception e)
    {
        // Exception occurred. Port is already bound.
        return true;
    }
}

Я сейчас нахожусьвызывая эту функцию, начиная с определенного порта в цикле for, чтобы получить «ложное» возвращение на первом доступном порту.Первый порт, который я пробую, фактически прослушивается uTorrent.Приведенный выше код не улавливает это, и мое соединение не устанавливается.

Каков наилучший способ обеспечить свободный доступ к порту?Я понимаю, что некоторые другие программы могут захватить порт во время / после того, как я проверил его.Мне просто нужно найти что-то, что гарантирует, что он не используется в данный момент при выполнении теста.

Если есть способ действительно зарезервировать порт localhost во время теста, я хотел бы услышать оэто.

1 Ответ

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

Вот ответ, как проверить, свободен ли локальный порт.

Я бы порекомендовал так:

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;          
}
...