Forma inteligente de obtener la dirección IP pública de Internet / geo loc

Tengo una computadora en la red local, detrás de un enrutador NAT. Tengo algunas direcciones 192.168.0.x, pero realmente quiero saber mi dirección IP pública , no algo mencionado en

¿Cómo obtener la dirección IP del servidor en el que se ejecuta mi aplicación C #?

o

Cómo obtener la dirección IP de una máquina en C #

Necesito el código C #.

¿Es posible? ¿Si es así, cómo?

Prefiero http://icanhazip.com . Devuelve una cadena de texto simple. No requiere análisis HTML.

 string myIp = new WebClient().DownloadString(@"http://icanhazip.com").Trim(); 

Después de algunas búsquedas, y al ampliar mis requisitos, descubrí que esto me proporcionaría no solo la IP, sino también la ubicación de GEO:

 class GeoIp { static public GeoIpData GetMy() { string url = "http://freegeoip.net/xml/"; WebClient wc = new WebClient(); wc.Proxy = null; MemoryStream ms = new MemoryStream(wc.DownloadData(url)); XmlTextReader rdr = new XmlTextReader(url); XmlDocument doc = new XmlDocument(); ms.Position = 0; doc.Load(ms); ms.Dispose(); GeoIpData retval = new GeoIpData(); foreach (XmlElement el in doc.ChildNodes[1].ChildNodes) { retval.KeyValue.Add(el.Name, el.InnerText); } return retval; } } 

XML devuelto, y así el diccionario de clave / valor se llenará como tal:

  93.139.127.187 HR Croatia 16 Varazdinska Varazdinske Toplice  46.2092 16.4192   

Y por conveniencia, clase de retorno:

 class GeoIpData { public GeoIpData() { KeyValue = new Dictionary(); } public Dictionary KeyValue; } 

El problema es que la dirección IP que está buscando no pertenece a su computadora. Pertenece a su enrutador NAT. La única forma en que puedo pensar en obtenerlo es usar un servidor externo o tener alguna forma de consultar su enrutador.

Si su enrutador admite SNMP, puede obtenerlo de esa manera.

Creo que realmente necesitas conectarte con algún servidor para obtener tu IP externa.

Dependiendo del enrutador que utilice, es muy probable que pueda obtenerlo directamente desde el enrutador. La mayoría de ellos tiene una interfaz web, por lo que sería una cuestión de navegar a la página web correcta (por ejemplo, “192.168.0.1/whatever”) y “raspar” la dirección IP externa de esa página. El problema con esto es, por supuesto, que es bastante frágil: si cambia (o incluso reconfigura) su enrutador, es muy probable que se rompa.

es posible que pueda usar uPNP y retroceder a whatsmyip.com si eso falla.

Si le preocupa la pérdida de conexión o la disponibilidad del sitio, también puede intentar esta manera para evitar ese problema al incluir las sugerencias anteriores.

  using System.Threading; Task[] tasks = new[] { Task.Factory.StartNew( () => new System.Net.WebClient().DownloadString(@"http://icanhazip.com").Trim() ), Task.Factory.StartNew( () => new System.Net.WebClient().DownloadString(@"http://checkip.dyndns.org").Trim() ) }; int index = Task.WaitAny( tasks ); string ip = tasks[index].Result; 

Espero que esta también ayude.

Lo hago así: creo una clase que contiene los datos de ubicación geográfica.

 [Serializable] public class LocationData { public string IP { get; set; } public string CountryCode { get; set; } public string CountryName { get; set; } public string RegionCode { get; set; } public string City { get; set; } public string ZipCode { get; set; } public string TimeZone { get; set; } public string Latitude { get; set; } public string Longitude { get; set; } public string MetroCode { get; set; } } 

luego uso el siguiente código para llamar a los datos geográficos y completar la clase.

 public static LocationData GetLocation(string ip= "") { using (var client = new System.Net.WebClient()) { XmlRootAttribute xRoot = new XmlRootAttribute(); xRoot.ElementName = "Response"; string downloadedString = client.DownloadString("http://freegeoip.net/xml/" + ip); XmlSerializer mySerializer = new XmlSerializer(typeof(LocationData), xRoot) ; using (XmlReader xmlReader = XmlReader.Create(new System.IO.StringReader(downloadedString))) { return mySerializer.Deserialize(xmlReader)as LocationData; } } } 

como la respuesta es “mala”, xml necesita especificar el elemento xRoot o se obtiene un error.

Feliz codificacion

Walter

El siguiente código le ayudará a tomar la dirección IP pública

  string _externalIP; _externalIP = (new WebClient()).DownloadString("http://http://icanhazip.com/"); _externalIP = (new Regex(@"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}")) .Matches(externalIP)[0].ToString();