Ottieni un indirizzo IP pubblico / esterno?

Non riesco a trovare o trovare informazioni su come trovare il mio IP pubblico sui router? È perché non può essere fatto in questo modo e dovrebbe farlo da un sito web?

Da C #, è ansible utilizzare le librerie client Web per scaricare whatismyip

 static void Main(string[] args) { HTTPGet req = new HTTPGet(); req.Request("http://checkip.dyndns.org"); string[] a = req.ResponseBody.Split(':'); string a2 = a[1].Substring(1); string[] a3=a2.Split('<'); string a4 = a3[0]; Console.WriteLine(a4); Console.ReadLine(); } 

Fai questo piccolo trucco con Check IP DNS

Usa la class HTTPGet ho trovato su Goldb-Httpget C #

Usando C #, Con webclient è breve.

 public static void Main(string[] args) { string externalip = new WebClient().DownloadString("http://icanhazip.com"); Console.WriteLine(externalip); } 

Command Line (funziona su Linux e Windows)

 wget -qO- http://bot.whatismyipaddress.com 

O

 curl http://ipinfo.io/ip 

Con. Net WebRequest:

  public static string GetPublicIP() { string url = "http://checkip.dyndns.org"; System.Net.WebRequest req = System.Net.WebRequest.Create(url); System.Net.WebResponse resp = req.GetResponse(); System.IO.StreamReader sr = new System.IO.StreamReader(resp.GetResponseStream()); string response = sr.ReadToEnd().Trim(); string[] a = response.Split(':'); string a2 = a[1].Substring(1); string[] a3 = a2.Split('<'); string a4 = a3[0]; return a4; } 
 string pubIp = new System.Net.WebClient().DownloadString("https://api.ipify.org"); 

Servizio simile

 private string GetPublicIpAddress() { var request = (HttpWebRequest)WebRequest.Create("http://ifconfig.me"); request.UserAgent = "curl"; // this simulate curl linux command string publicIPAddress; request.Method = "GET"; using (WebResponse response = request.GetResponse()) { using (var reader = new StreamReader(response.GetResponseStream())) { publicIPAddress = reader.ReadToEnd(); } } return publicIPAddress.Replace("\n", ""); } 

In teoria il tuo router dovrebbe essere in grado di dirti l’indirizzo IP pubblico della rete, ma il modo di farlo sarà necessariamente incoerente / non diretto, se ansible anche con alcuni dispositivi router.

Il metodo più semplice e ancora molto affidabile è quello di inviare una richiesta a una pagina Web che restituisce il tuo indirizzo IP come lo vede il server web. Dyndns.org fornisce un buon servizio per questo:

http://checkip.dyndns.org/

Ciò che viene restituito è un documento HTML estremamente semplice / breve, contenente il testo Current IP Address: 157.221.82.39 (falso IP), che è banale da estrarre dalla risposta HTTP.

Modo rapido per ottenere un IP esterno senza alcuna connessione Non è necessaria alcuna connessione Http per questo

per prima cosa è necessario aggiungere NATUPNPLib.dll su Referance e selezionarlo dai riferimenti e controllare dalla finestra delle proprietà Incorpora tipo di interoperabilità su False

 using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; using NATUPNPLib; // Add this dll from referance and chande Embed Interop Interop to false from properties panel on visual studio using System.Net; namespace Client { class NATTRAVERSAL { //This is code for get external ip private void NAT_TRAVERSAL_ACT() { UPnPNATClass uPnP = new UPnPNATClass(); IStaticPortMappingCollection map = uPnP.StaticPortMappingCollection; foreach (IStaticPortMapping item in map) { Debug.Print(item.ExternalIPAddress); //This line will give you external ip as string break; } } } } 

Espandendo questa risposta di @ suneel ranga :

 static System.Net.IPAddress GetPublicIp(string serviceUrl = "https://ipinfo.io/ip") { return System.Net.IPAddress.Parse(new System.Net.WebClient().DownloadString(serviceUrl)); } 

Dove si utilizza un servizio con System.Net.WebClient che mostra semplicemente l’indirizzo IP come una stringa e utilizza l’object System.Net.IPAddress . Ecco alcuni di questi servizi *:

* Alcuni servizi sono stati menzionati in questa domanda e da queste risposte dal sito di superutente .

Con poche righe di codice è ansible scrivere il proprio server Http per questo.

 HttpListener listener = new HttpListener(); listener.Prefixes.Add("http://+/PublicIP/"); listener.Start(); while (true) { HttpListenerContext context = listener.GetContext(); string clientIP = context.Request.RemoteEndPoint.Address.ToString(); using (Stream response = context.Response.OutputStream) using (StreamWriter writer = new StreamWriter(response)) writer.Write(clientIP); context.Response.Close(); } 

Quindi, ogni volta che devi conoscere il tuo IP pubblico, puoi farlo.

 WebClient client = new WebClient(); string ip = client.DownloadString("http://serverIp/PublicIP"); 

checkip.dyndns.org non funziona sempre correttamente. Ad esempio, per la mia macchina mostra l’indirizzo post-NAT interno:

 Current IP Address: 192.168.1.120 

Penso che stia accadendo, perché ho la mia zona DNS locale dietro NAT, e il mio browser manda a controllare il suo indirizzo IP locale, che viene restituito.

Inoltre, http è un protocollo basato su TCP e basato su testo pesante, quindi non molto adatto per una richiesta regolare rapida ed efficiente per l’indirizzo IP esterno. Suggerisco di usare STUN basato su UDP, binario, appositamente progettato per questo scopo:

http://en.wikipedia.org/wiki/STUN

Il server STUN è come “mirror UDP”. Stai guardando ad esso, e vedi “come sembro”.

Esistono molti server pubblici STUN in tutto il mondo, dove è ansible richiedere il proprio IP esterno. Ad esempio, vedi qui:

http://www.voip-info.org/wiki/view/STUN

È ansible scaricare qualsiasi libreria client STUN, da Internet, ad esempio, qui:

http://www.codeproject.com/Articles/18492/STUN-Client

E usalo.

Lo faccio usando HttpClient da System.Net.Http :

 public static string PublicIPAddress() { string uri = "http://checkip.dyndns.org/"; string ip = String.Empty; using (var client = new HttpClient()) { var result = client.GetAsync(uri).Result.Content.ReadAsStringAsync().Result; ip = result.Split(':')[1].Split('<')[0]; } return ip; } 
 public static string GetPublicIP() { return new System.Net.WebClient().DownloadString("https://ipinfo.io/ip").Replace("\n",""); } 

Quando eseguo il debug, utilizzo il seguente per creare l’URL richiamabile esternamente, ma è ansible utilizzare solo le prime 2 righe per ottenere il proprio IP pubblico:

 public static string ExternalAction(this UrlHelper helper, string actionName, string controllerName = null, RouteValueDictionary routeValues = null, string protocol = null) { #if DEBUG var client = new HttpClient(); var ipAddress = client.GetStringAsync("http://ipecho.net/plain").Result; // above 2 lines should do it.. var route = UrlHelper.GenerateUrl(null, actionName, controllerName, routeValues, helper.RouteCollection, helper.RequestContext, true); if (route == null) { return route; } if (string.IsNullOrEmpty(protocol) && string.IsNullOrEmpty(ipAddress)) { return route; } var url = HttpContext.Current.Request.Url; protocol = !string.IsNullOrWhiteSpace(protocol) ? protocol : Uri.UriSchemeHttp; return string.Concat(protocol, Uri.SchemeDelimiter, ipAddress, route); #else helper.Action(action, null, null, HttpContext.Current.Request.Url.Scheme) #endif } 

Ho scoperto che http://checkip.dyndns.org/ mi stava dando dei tag html che dovevo elaborare ma https://icanhazip.com/ mi stava solo dando una semplice stringa. Purtroppo https://icanhazip.com/ mi dà l’indirizzo ip6 e ho bisogno di ip4. Fortunatamente ci sono 2 sottodomini tra cui puoi scegliere, ipv4.icanhazip.com e ipv6.icanhazip.com.

  string externalip = new WebClient().DownloadString("https://ipv4.icanhazip.com/"); Console.WriteLine(externalip); Console.WriteLine(externalip.TrimEnd()); 

La migliore risposta che ho trovato

Per ottenere l’indirizzo IP remoto nel modo più veloce ansible. È necessario utilizzare un downloader o creare un server sul computer.

Gli svantaggi di utilizzare questo semplice codice: (che è consigliato) è che ci vorranno 3-5 secondi per ottenere il tuo indirizzo IP remoto perché il WebClient quando inizializzato richiede sempre 3-5 secondi per verificare le impostazioni del proxy.

  public static string GetIP() { string externalIP = ""; externalIP = new WebClient().DownloadString("http://checkip.dyndns.org/"); externalIP = (new Regex(@"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}")) .Matches(externalIP)[0].ToString(); return externalIP; } 

Ecco come l’ho risolto .. (la prima volta richiede ancora 3-5 secondi), ma in seguito otterrà sempre l’indirizzo IP remoto in 0-2 secondi, a seconda della connessione.

 public static WebClient webclient = new WebClient(); public static string GetIP() { string externalIP = ""; externalIP = webclient.DownloadString("http://checkip.dyndns.org/"); externalIP = (new Regex(@"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}")) .Matches(externalIP)[0].ToString(); return externalIP; } 

La maggior parte delle risposte ha menzionato http://checkip.dyndns.org in soluzione. Per noi, non ha funzionato bene. Abbiamo affrontato Timemouts un sacco di tempo. È davvero preoccupante se il tuo programma dipende dal rilevamento IP.

Come soluzione, utilizziamo il seguente metodo in una delle nostre applicazioni desktop:

  // Returns external/public ip protected string GetExternalIP() { try { using (MyWebClient client = new MyWebClient()) { client.Headers["User-Agent"] = "Mozilla/4.0 (Compatible; Windows NT 5.1; MSIE 6.0) " + "(compatible; MSIE 6.0; Windows NT 5.1; " + ".NET CLR 1.1.4322; .NET CLR 2.0.50727)"; try { byte[] arr = client.DownloadData("http://checkip.amazonaws.com/"); string response = System.Text.Encoding.UTF8.GetString(arr); return response.Trim(); } catch (WebException ex) { // Reproduce timeout: http://checkip.amazonaws.com:81/ // trying with another site try { byte[] arr = client.DownloadData("http://icanhazip.com/"); string response = System.Text.Encoding.UTF8.GetString(arr); return response.Trim(); } catch (WebException exc) { return "Undefined"; } } } } catch (Exception ex) { // TODO: Log trace return "Undefined"; } } 

Buona parte, entrambi i siti restituiscono IP in formato semplice. Quindi le operazioni con le stringhe sono evitate.

Per verificare la logica nella clausola catch , è ansible riprodurre Timeout toccando una porta non disponibile. ad esempio: http://checkip.amazonaws.com:81/

Fondamentalmente preferisco utilizzare alcuni backup aggiuntivi nel caso in cui uno di IP non sia accessibile. Quindi io uso questo metodo.

  public static string GetExternalIPAddress() { string result = string.Empty; try { using (var client = new WebClient()) { client.Headers["User-Agent"] = "Mozilla/4.0 (Compatible; Windows NT 5.1; MSIE 6.0) " + "(compatible; MSIE 6.0; Windows NT 5.1; " + ".NET CLR 1.1.4322; .NET CLR 2.0.50727)"; try { byte[] arr = client.DownloadData("http://checkip.amazonaws.com/"); string response = System.Text.Encoding.UTF8.GetString(arr); result = response.Trim(); } catch (WebException) { } } } catch { } if (string.IsNullOrEmpty(result)) { try { result = new WebClient().DownloadString("https://ipinfo.io/ip").Replace("\n", ""); } catch { } } if (string.IsNullOrEmpty(result)) { try { result = new WebClient().DownloadString("https://api.ipify.org").Replace("\n", ""); } catch { } } if (string.IsNullOrEmpty(result)) { try { result = new WebClient().DownloadString("https://icanhazip.com").Replace("\n", ""); } catch { } } if (string.IsNullOrEmpty(result)) { try { result = new WebClient().DownloadString("https://wtfismyip.com/text").Replace("\n", ""); } catch { } } if (string.IsNullOrEmpty(result)) { try { result = new WebClient().DownloadString("http://bot.whatismyipaddress.com/").Replace("\n", ""); } catch { } } if (string.IsNullOrEmpty(result)) { try { string url = "http://checkip.dyndns.org"; System.Net.WebRequest req = System.Net.WebRequest.Create(url); System.Net.WebResponse resp = req.GetResponse(); System.IO.StreamReader sr = new System.IO.StreamReader(resp.GetResponseStream()); string response = sr.ReadToEnd().Trim(); string[] a = response.Split(':'); string a2 = a[1].Substring(1); string[] a3 = a2.Split('<'); result = a3[0]; } catch (Exception) { } } return result; } 

Per aggiornare il controllo della GUI (WPF, .NET 4.5), ad esempio alcuni Label I usano questo codice

  void GetPublicIPAddress() { Task.Factory.StartNew(() => { var ipAddress = SystemHelper.GetExternalIPAddress(); Action bindData = () => { if (!string.IsNullOrEmpty(ipAddress)) labelMainContent.Content = "IP External: " + ipAddress; else labelMainContent.Content = "IP External: "; labelMainContent.Visibility = Visibility.Visible; }; this.Dispatcher.InvokeAsync(bindData); }); } 

Spero che sia utile

Ecco un esempio di app che includerà questo codice.

 public string GetClientIp() { var ipAddress = string.Empty; if (System.Web.HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"] != null) { ipAddress = System.Web.HttpContext.Current.Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString(); } else if (System.Web.HttpContext.Current.Request.ServerVariables["HTTP_CLIENT_IP"] != null && System.Web.HttpContext.Current.Request.ServerVariables["HTTP_CLIENT_IP"].Length != 0) { ipAddress = System.Web.HttpContext.Current.Request.ServerVariables["HTTP_CLIENT_IP"]; } else if (System.Web.HttpContext.Current.Request.UserHostAddress.Length != 0) { ipAddress = System.Web.HttpContext.Current.Request.UserHostName; } return ipAddress; } 

funziona perfettamente

 using System.Net; private string GetWorldIP() { String url = "http://bot.whatismyipaddress.com/"; String result = null; try { WebClient client = new WebClient(); result = client.DownloadString(url); return result; } catch (Exception ex) { return "127.0.0.1"; } } 

Loopback usato come fallback solo così le cose non si rompono fatalmente.

È ansible utilizzare Telnet per interrogare a livello di programmazione il router per l’IP WAN.

La parte Telnet

La parte Telnet può essere realizzata utilizzando, ad esempio, questo codice Telnet Minimalistic come API per inviare un comando Telnet al router e ottenere la risposta del router. Il resto di questa risposta presuppone che tu sia impostato in un modo o nell’altro per inviare un comando Telnet e recuperare la risposta nel tuo codice.

Limiti di approccio

Devo dire che l’unico inconveniente di interrogare il router rispetto ad altri approcci è che il codice che scrivi è probabilmente abbastanza specifico per il tuo modello di router. Detto questo, può essere un approccio utile che non si basa su server esterni e si potrebbe comunque voler accedere al router dal proprio software per altri scopi, come la configurazione e il controllo, rendendo più utile la scrittura di codice specifico.

Esempio di comando e risposta del router

L’esempio seguente non è corretto per tutti i router, ma illustra l’approccio in linea di principio. Sarà necessario modificare i dettagli per adattarli ai comandi e alle risposte del router.

Ad esempio, il modo in cui il router può mostrare l’IP WAN potrebbe essere il seguente comando Telnet:

 connection list 

L’output può consistere in un elenco di righe di testo, una per connessione, con l’indirizzo IP all’offset 39. La linea per la connessione WAN può essere identificabile dalla parola “Internet” da qualche parte nella riga:

  RESP: 3947 17.110.226. 13:443 146.200.253. 16:60642 [R..A] Internet 6 tcp 128 <------------------ 39 -------------><-- WAN IP --> 

L’output può riempire ogni segmento di indirizzo IP di tre caratteri con spazi, che sarà necessario rimuovere. (Ovvero, nell’esempio sopra, dovresti trasformare “146.200.253. 16” in “146.200.253.16”.)

Tramite la sperimentazione o la consultazione della documentazione di riferimento per il router, è ansible stabilire il comando da utilizzare per il router specifico e come interpretare la risposta del router.

Codice per ottenere l’IP WAN

(Si sendRouterCommand avere un metodo sendRouterCommand per la parte Telnet, vedere sopra ) .

Utilizzando il router di esempio descritto sopra, il codice seguente ottiene l’IP della WAN:

 private bool getWanIp(ref string wanIP) { string routerResponse = sendRouterCommand("connection list"); return (getWanIpFromRouterResponse(routerResponse, out wanIP)); } private bool getWanIpFromRouterResponse(string routerResponse, out string ipResult) { ipResult = null; string[] responseLines = routerResponse.Split(new char[] { '\n' }); // RESP: 3947 17.110.226. 13:443 146.200.253. 16:60642 [R..A] Internet 6 tcp 128 //<------------------ 39 -------------><--- 15 ---> const int offset = 39, length = 15; foreach (string line in responseLines) { if (line.Length > (offset + length) && line.Contains("Internet")) { ipResult = line.Substring(39, 15).Replace(" ", ""); return true; } } return false; } 

L’API IPIFY è carina, in quanto può rispondere in testo non elaborato e JSON. Può anche fare callback ecc. L’unico problema è che risponde in IPv4, non in 6.

O questo, funziona abbastanza bene, penso per quello che mi serviva. È di qui .

 public IPAddress GetExternalIP() { WebClient lol = new WebClient(); string str = lol.DownloadString("http://www.ip-adress.com/"); string pattern = "

My IP address is: (.+)

" MatchCollection matches1 = Regex.Matches(str, pattern); string ip = matches1(0).ToString; ip = ip.Remove(0, 21); ip = ip.Replace(" ", ""); ip = ip.Replace(" ", ""); return IPAddress.Parse(ip); }