Frage

Wenn ich ein TCPChannel mit Port Zero erstelle, dh .NET Remoting eine verfügbare Port -Ports zuzuweisen, dann gibt es ohnehin, welche Portnummer zugewiesen wurde?

Ich weiß, dass ich beim Erstellen des Kanals die Portnummer angeben kann. Ich möchte dies jedoch nicht tun, da ich mehrere Instanzen der Höranwendung auf demselben Citrix -Server ausführen möchte - jede Instanz, die auf einem anderen Port hört.

Idealerweise möchte ich mich nicht vorstellen, eine Reihe von Ports zu reservieren und dann den Überblick zu behalten, welche zugewiesen wurden. Ich möchte nur den Port automatisch zugeteilt werden - aber dann muss ich wissen, welche Portnummer zugewiesen wurde.

War es hilfreich?

Lösung 2

Meine Lösung war wie folgt:

  • Verwenden Sie den folgenden Code, um einen nicht verwendeten Port für jede Instanz der Client -Anwendung zu identifizieren:

    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;
    }
    
  • Speichern Sie die nicht verwendete Portnummer in der Client -Anwendung.

  • Übergeben Sie die gespeicherte Portnummer über einen Befehlszeilenparameter an die Hostanwendung, um beim Einrichten der TCPChannel und des Aufrufens von Activator.getObject zu verwenden.

  • Verwenden Sie die gespeicherte Portnummer in der Client -Anwendung in der URL, die an active.getObject übergeben wurde.

Andere Tipps

Ich weiß nicht viel darüber, aber wenn man bei MSDN stöbert TcpServerChannel, und ein TcpServerChannel hat ein GetChannelUri() Methode; Enthält das die Portnummer? (Möglicherweise müssen Sie analysieren, über via new Uri(s).Port).

Nochmals vollständige Vermutung. Wenn nicht, sagen Sie einfach ;-P

Bearbeiten von Aakashm zum Hinzufügen Dies ist der richtige Ansatz. Folgen

var channel = new TcpChannel(0);

Der dynamisch zugeteilte Beitrag des enthaltenen Serverkanals kann mit abgerufen werden

var channelData = (ChannelDataStore)channel.ChannelData;
var port = new System.Uri(channelData.ChannelUris[0]).Port;

Die hässliche Besetzung ist notwendig, weil die TcpChannel.ChannelData Eigenschaft wird als getippt als object...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top