Как мне узнать, какой номер порта выделяет .Net Remoting?

StackOverflow https://stackoverflow.com/questions/412305

  •  03-07-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение 2

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

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

    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.

Другие советы

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

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

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

var channel = new TcpChannel(0);

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top