moder Skrevet 19. januar 2011 Skrevet 19. januar 2011 (endret) Hei Forum Jeg plages litt med denne koden: foreach (IPAddress ia in myIPs.AddressList) if (AddressFamily.InterNetwork == ia.AddressFamily) { //MessageBox.Show(ia.AddressFamily.ToString()); myIP = ia.Address.ToString(); } txtIp.Text = myIP.ToString(); IPAddress ipAddr = IPAddress.Parse(txtIp.Text); // txtIp.Text = ipAddr.ToString(); Problemet er at jeg har en ip addresse 42.93.37.114 men denne oppgir en ip addresse: 114.37.93.42 Vet dete hva som er galt? Endret 19. januar 2011 av moder
moder Skrevet 19. januar 2011 Forfatter Skrevet 19. januar 2011 Det er jo speilvendt. Hvorfor ???? Det er det jeg ikke finner ut
GeirGrusom Skrevet 24. januar 2011 Skrevet 24. januar 2011 (endret) Kan du venligst ikke gjøre så masse redundante funksjoner i eksemplene dine? Det gjør det vanskeligere å lese koden. Koden din kan enkelt erstattes av txtIP.Text = (myIPs.FirstOrDefault() ?? IPAddress.None).ToString() Men du gjør masse unødvendige parsinger og tullball. edit: unnskyld at jeg er litt gretten. Jeg vet ikke hvorfor du får feil data, men det kan tenkes at det er en feil i konverteringen. Dette kan komme av all den redundante koden, men jeg vet ærlig talt ikke. Endret 24. januar 2011 av GeirGrusom
moder Skrevet 24. januar 2011 Forfatter Skrevet 24. januar 2011 Kan du venligst ikke gjøre så masse redundante funksjoner i eksemplene dine? Det gjør det vanskeligere å lese koden. Koden din kan enkelt erstattes av txtIP.Text = (myIPs.FirstOrDefault() ?? IPAddress.None).ToString() Men du gjør masse unødvendige parsinger og tullball. edit: unnskyld at jeg er litt gretten. Jeg vet ikke hvorfor du får feil data, men det kan tenkes at det er en feil i konverteringen. Dette kan komme av all den redundante koden, men jeg vet ærlig talt ikke. Jeg får en feil melding på myIPs.FirstOrDefault() Der FirstOrDefault() ikke finnes?
moder Skrevet 24. januar 2011 Forfatter Skrevet 24. januar 2011 Da må du importere System.Linq på toppen. Har allerede gjort det
The Jackal Skrevet 25. januar 2011 Skrevet 25. januar 2011 Først og fremst er IPAddress.Address markert Obsolete, så denne skal du ikke bruke egentlig. Grunnen til at addressen kommer bakvendt, er pga (tror jeg) NetworkToHostOrder/HostToNetworkOrder. Maskinen/OSet har litt forskjellig måte å angi tall på kan man si. Anyways...her er en metode som gir deg en liste over alle IP4/6 adresser: private static IEnumerable<string> GetIpAddress(string hostNameOrAddress) { var builder = new StringBuilder(); var addresses = new List<string>(); var hostEntry = Dns.GetHostEntry(hostNameOrAddress); foreach (var ipAddress in hostEntry.AddressList) { var bytes = ipAddress.GetAddressBytes(); for (var i = 0; i < bytes.Length; i++) { builder.Append(bytes[i]); if (ipAddress.AddressFamily == AddressFamily.InterNetwork && i < bytes.Length - 1) builder.Append("."); else if (ipAddress.AddressFamily == AddressFamily.InterNetworkV6 && i < bytes.Length - 1) builder.Append(":"); } addresses.Add(builder.ToString()); builder.Clear(); } return addresses; }
GeirGrusom Skrevet 25. januar 2011 Skrevet 25. januar 2011 private static IEnumerable<string> GetIp4Addresses(string HostNameOrAddress) { var entry = Dns.GetHostEntry(HostNameOrAddress); var items = from item in entry.AddressList where item.AddressFamily == AddressFamily.InterNetwork select item.ToString(); return items; } The Jackal: Du kan bruke yield return så slipper du listen din. Endret den litt. Usikker på om forkortingen er helt korrekt, men det funker ihvertfall på localhost. private static IEnumerable<string> GetIpAddress(string hostNameOrAddress) { var builder = new StringBuilder(); var hostEntry = Dns.GetHostEntry(hostNameOrAddress); foreach (var ipAddress in hostEntry.AddressList) { var is_ip4 = ipAddress.AddressFamily == AddressFamily.InterNetwork; var bytes = ipAddress.GetAddressBytes(); for (var i = 0; i < bytes.Length; i++) { builder.Append(is_ip4 ? bytes[i].ToString() : bytes[i].ToString("x")); if(i < bytes.Length - 1) builder.Append(is_ip4 ? '.' : ':'); } var s = builder.ToString(); // Shorten IPv6 address if (!is_ip4) s = System.Text.RegularExpressions.Regex.Replace(s, "0:(0:)*0:", "::"); yield return s; builder.Clear(); } }
The Jackal Skrevet 26. januar 2011 Skrevet 26. januar 2011 Du har naturligvis rett med yield return, koden jeg laget var bare noe jeg slang sammen for å bruke non obsolete properties Forøvrig litt merkelig at IPAddress.ToString() metoden kun fungerer for IP4 om jeg leser MSDN korrekt. Har vel kanskje noe med at den bare returnerer IPAddress.Address og den kun støtter 32bit adresser.
GeirGrusom Skrevet 26. januar 2011 Skrevet 26. januar 2011 Ja, det er ganske snodig :S En kan lure på hva som skal være tanken bak det.
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå