Pregunta

Necesito saber el externo IP de la computadora una aplicación de C# se ejecuta en.

En la solicitud que tengo una conexión (a través de .NET remoting) a un servidor.Hay una buena manera de obtener la dirección del cliente en el lado del servidor?

(He editado la pregunta, para ser un poco más claro.Estoy disculpas a todo tipo de personas que hicieron su mejor esfuerzo para responder a la pregunta, cuando yo era quizás un poco demasiado vago)

Solución:
He encontrado una forma en que ha funcionado muy bien para mí.Mediante la aplicación de una costumbre IServerChannelSinkProvider y IServerChannelSink donde tengo acceso a CommonTransportKeys.IPAddress, es fácil añadir la ip del cliente en el CallContext.

public ServerProcessing ProcessMessage(IServerChannelSinkStack sinkStack, 
    IMessage requestmessage, ITransportHeaders requestHeaders, 
    System.IO.Stream requestStream, out IMessage responseMessage, 
    out ITransportHeaders responseHeaders, out System.IO.Stream responseStream)
{
    try
    {
        // Get the IP address and add it to the call context.
        IPAddress ipAddr = (IPAddress)requestHeaders[CommonTransportKeys.IPAddress];
        CallContext.SetData("ClientIP", ipAddr);
    }
    catch (Exception)
    {
    }

    sinkStack.Push(this, null);
    ServerProcessing srvProc = _NextSink.ProcessMessage(sinkStack, requestmessage, requestHeaders,
        requestStream, out responseMessage, out responseHeaders, out responseStream);

    return srvProc;
}

Y luego, más tarde (cuando llego a una petición de un cliente) acaba de obtener la IP de la CallContext como este.

public string GetClientIP()
{
    // Get the client IP from the call context.
    object data = CallContext.GetData("ClientIP");

    // If the data is null or not a string, then return an empty string.
    if (data == null || !(data is IPAddress))
        return string.Empty;

    // Return the data as a string.
    return ((IPAddress)data).ToString();
}

Ahora puedo enviar la IP para el cliente.

¿Fue útil?

Solución 5

He encontrado una forma en que ha funcionado muy bien para mí.Mediante la aplicación de una costumbre IServerChannelSinkProvider y IServerChannelSink donde tengo acceso a CommonTransportKeys.IPAddress, es fácil añadir la ip del cliente en el CallContext.

public ServerProcessing ProcessMessage(IServerChannelSinkStack sinkStack, 
    IMessage requestmessage, ITransportHeaders requestHeaders, 
    System.IO.Stream requestStream, out IMessage responseMessage, 
    out ITransportHeaders responseHeaders, out System.IO.Stream responseStream)
{
    try
    {
        // Get the IP address and add it to the call context.
        IPAddress ipAddr = (IPAddress)requestHeaders[CommonTransportKeys.IPAddress];
        CallContext.SetData("ClientIP", ipAddr);
    }
    catch (Exception)
    {
    }

    sinkStack.Push(this, null);
    ServerProcessing srvProc = _NextSink.ProcessMessage(sinkStack, requestmessage, requestHeaders,
        requestStream, out responseMessage, out responseHeaders, out responseStream);

    return srvProc;
}

Y luego, más tarde (cuando llego a una petición de un cliente) acaba de obtener la IP de la CallContext como este.

public string GetClientIP()
{
    // Get the client IP from the call context.
    object data = CallContext.GetData("ClientIP");

    // If the data is null or not a string, then return an empty string.
    if (data == null || !(data is IPAddress))
        return string.Empty;

    // Return the data as a string.
    return ((IPAddress)data).ToString();
}

Ahora puedo enviar la IP para el cliente.

Otros consejos

Esta es una de esas preguntas en las que tienes que buscar más profundo y tal vez reconsiderar el problema original;en este caso, "por Qué usted necesita una dirección IP externa?"

El problema es que el equipo no tiene una dirección IP externa.Por ejemplo, mi portátil tiene una dirección IP interna (192.168.x.y) asignada por el router.El router tiene una dirección IP interna, pero su "externo" de la dirección IP es también interno.Sólo se utiliza para comunicarse con el módem DSL, que tiene en realidad externa, de cara a internet la dirección IP.

Así que la verdadera pregunta es, "¿Cómo puedo obtener la Internet dirección IP de un dispositivo de 2 saltos de distancia?" Y la respuesta es, en general, no;al menos no sin el uso de un servicio, tales como whatismyip.com que ya se ha despedido, o haciendo un enorme hack involucrando a codificar el módem DSL contraseña en la aplicación y consultar el módem DSL y la pantalla de raspado de la página de administración (y que Dios te ayude si el módem es cada vez sustituido).

EDITAR:Ahora para aplicar este hacia el refactorizado pregunta, "¿Cómo puedo obtener la dirección IP de mi cliente desde un servidor .NET componente?" Como whatismyip.com el mejor el servidor será capaz de hacer es darle la dirección IP de tu internet del dispositivo, lo que es poco probable a ser la dirección IP del equipo que ejecuta la aplicación.Volviendo a mi laptop, si mi Internet IP fue 75.75.75.75 y la IP de la LAN fue 192.168.0.112, el servidor sólo sería capaz de ver la 75.75.75.75 dirección IP.Que va a llegar tan lejos como mi módem DSL.Si su servidor quería hacer una conexión independiente de vuelta a mi laptop, me gustaría, en primer lugar es necesario configurar el módem DSL y los enrutadores entre ella y mi ordenador portátil para reconocer las conexiones entrantes de tu servidor y la ruta de una manera adecuada.Hay un par de maneras de hacer esto, pero queda fuera del ámbito de este tema.

Si en realidad usted está tratando de hacer una conexión desde el servidor al cliente, a repensar su diseño, ya que están ahondando en WTF territorio (o al menos, hacer que la aplicación sea mucho más difícil de implementar).

Dns.GetHostEntry(Dns.GetHostName());devolverá un array de direcciones IP.El primero de ellos debería ser la IP externa, el resto serán los que están detrás de NAT.

Así:

IPHostEntry IPHost = Dns.GetHostEntry(Dns.GetHostName());
string externalIP = IPHost.AddressList[0].ToString();

EDITAR:

Hay informes de que esto no funciona para algunas personas.Lo hace por mí, pero tal vez dependiendo de su configuración de red, puede que no funcione.

Mejor utilizar http://www.whatismyip.com/automation/n09230945.asp sólo salidas de la IP sólo para las búsquedas automatizadas.

Si usted quiere algo que no depende de alguien más poner en marcha su propia página http://www.unkwndesign.com/ip.php es sólo una rápida secuencia de comandos:

<?php
echo 'Your Public IP is: ' . $_SERVER['REMOTE_ADDR'];
?>

El único inconveniente aquí es que sólo recuperar la IP externa de la interfaz que se utiliza para crear la solicitud.

Jonathan Holland respuesta es fundamentalmente correcto, pero vale la pena agregar que las llamadas a la API detrás de Dns.GetHostByName son bastante tiempo y es una buena idea para almacenar en caché los resultados de modo que el código sólo se llama una vez.

El principal problema es la dirección IP pública no está necesariamente correlacionada con el equipo local que ejecuta la aplicación.Es traducido de la red interna a través del firewall.Para realmente obtener la IP pública sin interrogar a la red local es para hacer una petición a una página de internet y devolver el resultado.Si usted no desea utilizar un públicamente disponible WhatIsMyIP.com tipo de sitio que usted puede crear fácilmente una y host it yourself - preferiblemente como un webservice para que pueda hacer un simple jabón compatible con llamada a él desde dentro de la aplicación.No necesariamente hacer una captura de pantalla como mucho como un detrás de las escenas post y leer la respuesta.

Si sólo quieres la IP con la que está enlazado el adaptador, se puede utilizar WMI y la clase Win32_NetworkAdapterConfiguration.

http://msdn.microsoft.com/en-us/library/aa394217(VS.85).aspx

Patrik la solución que funciona para mí!

He hecho uno cambio importante.En el proceso de mensaje que establezca la CallContext usando este código:

// try to set the call context
LogicalCallContext lcc = (LogicalCallContext)requestMessage.Properties["__CallContext"];
if (lcc != null)
{
    lcc.SetData("ClientIP", ipAddr);
}

Esto coloca a la dirección ip correcta en la CallContext, por lo que se pueden recuperar más tarde con GetClientIP().

Bien, suponiendo que se tiene una System.Net.Sockets.TcpClient conectado a su cliente, puede (en el servidor) el uso de client.Client.RemoteEndPoint.Esto le dará una System.Net.EndPoint apuntando hacia el cliente;que debe contiene una instancia de la System.Net.IPEndPoint subclase, aunque no estoy seguro acerca de las condiciones para que.Después de la fundición a eso, se puede comprobar que Address propiedad para obtener la dirección del cliente.

En definitiva, tenemos

using (System.Net.Sockets.TcpClient client = whatever) {
    System.Net.EndPoint ep = client.Client.RemoteEndPoint;
    System.Net.IPEndPoint ip = (System.Net.IPEndPoint)ep;
    DoSomethingWith(ip.Address);
}

La buena suerte.

Yo creo que en teoría no puede hacer tal cosa, mientras que estar detrás de un router (por ejemplo,el uso no válido de rangos de ip) sin uso externo "ayuda".

Básicamente, puede analizar la página devuelta por hacer un WebRequest de http://whatismyipaddress.com

http://www.dreamincode.net/forums/showtopic24692.htm

La forma más confiable de hacer esto es la comprobación de un sitio como http://checkip.dyndns.org/ o similar, porque hasta que realmente vaya externos a su red, usted no puede encontrar su dirección IP externa.Sin embargo, codificar una URL está pidiendo el eventual fracaso.Usted puede desear sólo realizar esta comprobación si la IP actual se parece a un RFC1918 dirección privada (192.168.x.x siendo el más conocido de estos.

En su defecto, puede implementar su propio, similar, servicio sentado externo del servidor de seguridad, así que usted tendrá por lo menos saber si se ha roto.

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