Pregunta

Si creo un TcpChannel utilizando el puerto cero, es decir, permitiendo que .Net Remoting asigne un puerto disponible, ¿hay alguna forma de determinar qué número de puerto ha sido asignado?

Sé que puedo especificar el número de puerto al crear el canal, sin embargo, no quiero hacer esto porque quiero ejecutar varias instancias de la aplicación de escucha en el mismo servidor Citrix, cada instancia escucha en un puerto diferente .

Idealmente, no quiero tener que preocuparme por reservar un montón de puertos y luego hacer un seguimiento de cuáles han sido asignados. Simplemente me gustaría permitir que el puerto se asigne automáticamente, pero luego necesito poder saber qué número de puerto se ha asignado.

¿Fue útil?

Solución 2

Mi solución fue la siguiente:

  • Utilice el siguiente código para identificar un puerto no utilizado para cada instancia de la aplicación cliente:

    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;
    }
    
  • Almacene el número de puerto no utilizado en la aplicación cliente.

  • Pase el número de puerto almacenado a la aplicación host a través de un parámetro de línea de comandos para usarlo al configurar el TcpChannel y llamar a Activator.GetObject.

  • Use el número de puerto almacenado en la aplicación cliente en la URL pasada a Activator.GetObject.

Otros consejos

No sé mucho acerca de esto, pero al buscar en MSDN indica que el uso posterior a cero devuelve un TcpServerChannel , y un TcpServerChannel tiene un GetChannelUri ( ) método; ¿Eso incluye el número de puerto? (Es posible que deba analizar, a través de new Uri (s) .Port ).

De nuevo, completa el trabajo de adivinanzas. Si no, solo di ;-p

edite por AakashM para agregar Este es el enfoque correcto. Siguiendo

var channel = new TcpChannel(0);

la publicación asignada dinámicamente del canal del servidor contenido se puede recuperar con

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

La conversión fea es necesaria porque la propiedad TcpChannel.ChannelData se escribe como objeto ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top