3

ポートゼロを使用してTcpChannelを作成する場合、つまり.Net Remotingが使用可能なポートを割り当てることを許可する場合、どのポート番号が割り当てられているかを判断する方法はありますか?

チャネルを作成するときにポート番号を指定できることは知っていますが、同じCitrixサーバーでリスニングアプリケーションの複数のインスタンスを実行するため、これは行いません。各インスタンスは異なるポートでリッスンします。

理想的には、たくさんのポートを予約して、どのポートが割り当てられているかを追跡する手間をかけたくありません。ポートを自動的に割り当てたいのですが、どのポート番号が割り当てられているかを知る必要があります。

4

2 に答える 2

5

私はこれについてあまり知りませんが、MSDN をブラウジングすると、post zero usage が a を返し、TcpServerChannelaTcpServerChannelにはGetChannelUri()メソッドがあると記載されています。ポート番号は含まれていますか?(を介して解析する必要がある場合がありますnew Uri(s).Port)。

繰り返しますが、完全な推測作業です。そうでない場合は、;-pと言ってください

これは正しいアプローチです。続く

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 に答える