3

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

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

理想情况下,我不想费心保留一堆端口,然后跟踪已分配的端口。我只想让端口自动分配 - 但我需要能够知道已分配的端口号。

4

2 回答 2

5

我对此了解不多,但是在 MSDN 上浏览它指出零使用后返回 a TcpServerChannel,并且 aTcpServerChannel有一个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...

于 2009-01-05T05:05:07.517 回答
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 中使用客户端应用程序中存储的端口号。

于 2009-01-08T21:27:32.213 回答