Как мне узнать, какой номер порта выделяет .Net Remoting?
Вопрос
Если я создам 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
...