Как мне найти, какой номер порта .Net Remoting выделяет? - PullRequest
3 голосов
/ 05 января 2009

Если я создаю канал TcpChannel, используя нулевой порт, т. Е. Позволяя .Net Remoting выделять доступный порт, есть ли способ определить, какой номер порта был выделен?

Я знаю, что могу указать номер порта при создании канала, однако я не хочу этого делать, поскольку хочу запустить несколько экземпляров прослушивающего приложения на одном сервере Citrix - каждый экземпляр прослушивает свой порт ,

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

Ответы [ 2 ]

5 голосов
/ 05 января 2009

Я не знаю много об этом, но просматривая MSDN, он заявляет, что использование после нуля возвращает TcpServerChannel, а TcpServerChannel имеет метод GetChannelUri(); это включает номер порта? (возможно, вам потребуется выполнить синтаксический анализ через new Uri(s).Port).

Снова, полная догадка. Если нет, просто скажите; -p

отредактируйте AakashM, чтобы добавить Это правильный подход. После

var channel = new TcpChannel(0);

динамически размещаемая запись канала сервера может быть получена с помощью

var channelData = (ChannelDataStore)channel.ChannelData;
var port = new System.Uri(channelData.ChannelUris[0]).Port;

Уродливое приведение необходимо, потому что свойство TcpChannel.ChannelData имеет тип object ...

0 голосов
/ 09 января 2009

Мое решение было следующим:

  • Используйте следующий код для определения неиспользуемого порта для каждого экземпляра клиентского приложения:

    IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, 0);
    
    using (Socket socket = new Socket(
                 AddressFamily.InterNetwork, 
                 SocketType.Stream, 
                 ProtocolType.Tcp))
    {
        socket.Bind(endPoint);
        IPEndPoint local = (IPEndPoint)socket.LocalEndPoint;
        return local.Port;
    }
    
  • Сохранить номер неиспользуемого порта в клиентском приложении.

  • Передайте сохраненный номер порта хост-приложению через параметр командной строки для использования при настройке TcpChannel и вызове Activator.GetObject.

  • Используйте сохраненный номер порта в клиентском приложении в URL-адресе, переданном Activator.GetObject.

...