如果我使用端口零创建一个 TcpChannel,即允许 .Net Remoting 分配一个可用端口,那么无论如何确定分配了哪个端口号?
我知道我可以在创建通道时指定端口号,但是我不想这样做,因为我想在同一个 Citrix 服务器上运行多个侦听应用程序实例——每个实例侦听不同的端口。
理想情况下,我不想费心保留一堆端口,然后跟踪已分配的端口。我只想让端口自动分配 - 但我需要能够知道已分配的端口号。
我对此了解不多,但是在 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
...
我的解决方案如下:
使用以下代码为客户端应用程序的每个实例识别未使用的端口:
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 中使用客户端应用程序中存储的端口号。