Gå til innhold

Anbefalte innlegg

Hei Forum :tease:

 

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 av moder
Lenke til kommentar
Videoannonse
Annonse

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 av GeirGrusom
Lenke til kommentar

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?

Lenke til kommentar

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;
       }

Lenke til kommentar

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();
   }
}

Lenke til kommentar

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.

Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...