如何找到.Net Remoting分配的端口号?

时间:2009-01-05 04:53:54

标签: .net remoting port

如果我使用端口0创建TcpChannel,即允许.Net Remoting分配可用端口,那么无论如何要确定已分配了哪个端口号?

我知道我可以在创建频道时指定端口号,但我不想这样做,因为我想在同一Citrix服务器上运行多个侦听应用程序实例 - 每个实例都在不同的端口上侦听。

理想情况下,我不希望不得不去保留一堆端口,然后跟踪已分配的端口。我只想让端口自动分配 - 但是我需要知道哪个端口号已被分配。

2 个答案:

答案 0 :(得分:5)

我对此并不了解,但是在MSDN上浏览它表明,零使用后返回TcpServerChannel,而TcpServerChannelGetChannelUri()方法;那包括端口号吗? (您可能需要通过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 ......

答案 1 :(得分:0)

我的解决方案如下:

  • 使用以下代码为客户端应用程序的每个实例标识未使用的端口:

    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时使用。

  • 在传递给Activator.GetObject的URL中使用客户端应用程序中存储的端口号。