如果我使用端口0创建TcpChannel,即允许.Net Remoting分配可用端口,那么无论如何要确定已分配了哪个端口号?
我知道我可以在创建频道时指定端口号,但我不想这样做,因为我想在同一Citrix服务器上运行多个侦听应用程序实例 - 每个实例都在不同的端口上侦听。
理想情况下,我不希望不得不去保留一堆端口,然后跟踪已分配的端口。我只想让端口自动分配 - 但是我需要知道哪个端口号已被分配。
答案 0 :(得分:5)
我对此并不了解,但是在MSDN上浏览它表明,零使用后返回TcpServerChannel
,而TcpServerChannel
有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
......
答案 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中使用客户端应用程序中存储的端口号。