2010-08-14 25 views
3

Je veux augmenter mon adresse IP et;problème d'incrément d'adresse IP

Voici le code

ipAddressControl1.Text = "192.168.1.255"; 

byte[] ip = ipAddressControl1.GetAddressBytes(); 
ip[3] = (byte)(++ip[3]); 

IPAddress ipAddress1 = new IPAddress(ip); 
MessageBox.Show(ipAddress1.ToString()); 

ou j'ai essayé aussi ce

ipAddressControl3.Text = "192.168.1.255"; 
IPAddress ipAddress1 = new IPAddress(ıpAddressControl3.GetAddressBytes()); 
ipAddress1.Address += 0x1 << 24; 
MessageBox.Show(ipAddress1.ToString()); 

mais les deux me donne 192.168.1.0 mais je veux obtenir la valeur comme 192.168.2.0

+0

Pour le contexte, voir [cette question] (http://stackoverflow.com/questions/3482880/using-ip-address-component-c). –

Répondre

8

Votre problème est que vous n'augmentez pas ip[2] lorsque ip[3] s'enroule autour (et ainsi de suite dans la hiérarchie). Le code suivant devrait faire l'affaire, enfin envelopper de 255.255.255.255 à 0.0.0.0:

byte[] ip = ipAddressControl1.GetAddressBytes(); 
ip[3] = (byte)(ip[3] + 1); 
if (ip[3] == 0) { 
    ip[2] = (byte)(ip[2] + 1); 
    if (ip[2] == 0) { 
     ip[1] = (byte)(ip[1] + 1); 
     if (ip[1] == 0) { 
      ip[0] = (byte)(ip[0] + 1); 
     } 
    } 
} 

Peuvent également travailler:

byte[] ip = ipAddressControl1.GetAddressBytes(); 
if (++ip[3] == 0) 
    if (++ip[2] == 0) 
     if (++ip[1] == 0) 
      ++ip[0]; 
+0

Ça marche, mais ce n'est pas joli. –

+0

Pourquoi les doubles incréments redondants? – Timwi

+0

@silky, n'hésitez pas à poster une réponse avec un code "plus joli" si vous le souhaitez. C'est parfaitement lisible pour moi, et pour quelqu'un d'autre si vous venez de prendre ce premier paragraphe et de le mettre dans le code comme commentaire. Moi, je préfère la fonction à la forme. – paxdiablo

1

Vous devez vérifier si votre adresse est 254 - 255 et 0 sont des adresses de diffusion.

ipAddressControl1.Text = "192.168.1.255";

byte[] ip = ipAddressControl1.GetAddressBytes(); 
if (ip[3] != 255) 
{ 
    ip[3] = (byte)(++ip[3]); 
} 
else 
{ 
    ip[2] = (byte)(++ip[2]); 
    ip[3] = (byte)0; 
} 
IPAddress ipAddress1 = new IPAddress(ip); 
MessageBox.Show(ipAddress1.ToString()); 

Mais vous ne pouvez vérifier des trop-pleins jusqu'à IP [0] - vous devez prendre soin si vous touchez 255 là.

+0

Pourquoi l'incrément-et-affecter redondant? – Timwi

1

Dans le premier exemple, vous êtes seulement incrémenter la séquence 4 octets. Donc ça va passer de 255 à 0 sans effet sur byte [2]. Dans la deuxième séquence, vous l'incrémentez 1, mais vous passez ensuite de 2 à 1. Je ne sais pas pourquoi vous avez choisi de le faire.

0

Ressemble les adresses IP sont stockées le « mauvais sens » dans la .Address propriété que vous avez essayé d'utiliser:

192.168.1.255 
c0 a8 01 ff  is stored as 0xff01a8c0 

donc l'ajout 1 << 24 ne va incrémenter le 0xff à gauche puis tronquer, le transformant en 0.

Vous devrez écrire votre propre fonction d'addition si vous voulez que cela fonctionne comme vous le décrivez.

public static IPAddress IncrementIP(IPAddress addr) 
{ 
    byte[] ip = addr.GetAddressBytes(); 
    ip[3]++; 
    if (ip[3] == 0) { 
     ip[2]++; 
     if (ip[2] == 0) { 
      ip[1]++; 
      if (ip[1] == 0) 
       ip[0]++; 
     } 
    } 
    return new IPAddress(ip); 
} 

ou quelque chose comme ça.

0

Vous pouvez convertir l'adresse IP en son équivalent numérique.

Cochez cette question précédemment répondu pour plus de détails:

Best type for IP-address in Hibernate Entity?

public static string GetStandardIP(long numericIP) 
    { 
     string w = Convert.ToString(Convert.ToInt64(numericIP/16777216) % 256); 
     string x = Convert.ToString(Convert.ToInt64(numericIP/65536) % 256); 
     string y = Convert.ToString(Convert.ToInt64(numericIP/256) % 256); 
     string z = Convert.ToString(Convert.ToInt64(numericIP) % 256); 

     return w + "." + x + "." + y + "." + z; 
    } 

Et celui-ci

public static long GetNumericIP(string standardIP) 
    { 
      if (standardIP != null && standardIP != string.Empty) 
      { 
       string[] ipParts = standardIP.Split('.'); 
       long numericIP = 16777216 * Convert.ToInt64(ipParts[0]) + 65536 * Convert.ToInt64(ipParts[1]) + 256 * Convert.ToInt32(ipParts[2]) + Convert.ToInt32(ipParts[3]); 

       return numericIP; 
      } 
      return 0; 
    } 

Vous pouvez les améliorer en faisant des contrôles sur les paramètres et chaîne d'utilisation.concat

2

Il est peut-être intéressant de noter qu'aucune des réponses existantes ne gère les adresses IPv6, ce que la classe IPAddress elle-même prend en charge. Pour cela, vous voudrez probablement adopter une stratégie plus générale (et je ne suis pas sûr de ce que sont les règles d'incrément pour IPv6, bien qu'elles puissent être exactement les mêmes, juste avec plus d'octets pour le faire, ce que je soupçonne est l'affaire).

- Edit:

Sur cette base, cela semble fonctionner:

public static IPAddress Increment (IPAddress address) 
    { 
     IPAddress result; 

     byte[] bytes = address.GetAddressBytes(); 

     for(int k = bytes.Length - 1; k >= 0; k--){ 
      if(bytes[k] == byte.MaxValue){ 
       bytes[k] = 0; 
       continue; 
      } 

      bytes[k]++; 

      result = new IPAddress(bytes); 
      return result; 
     } 

     // Un-incrementable, return the original address. 
     return address; 
    } 
0

Je suis en désaccord avec la réponse fournie. Cela fonctionne sûrement, mais je peux voir de sérieux problèmes, à commencer par la lisibilité. À mon avis, la lisibilité et la maintenabilité sont primordiales, et la solution acceptée ne suffira tout simplement pas. Ajoutant à cela, une approche plus générique résoudra également le problème pour IPv6, tandis que la solution acceptée ne fonctionnera pas.

Ma proposition est d'utiliser la méthode suivante:

public static IPAddress AddOne(this IPAddress ipAddress) 
    { 
     byte[] data = ipAddress.GetAddressBytes(); 

     IncrementByOneFromRight(data, data.Length - 1); 

     return new IPAddress(data); 
    } 

    private static void IncrementByOneFromRight(byte[] data, int index) 
    { 
     if (index < 0) 
      return; 

     if (data[index] < byte.MaxValue) 
      data[index] += 1; 
     else 
     { 
      data[index] = 0; 

      IncrementByOneFromRight(data, index - 1); 
     } 
    } 

Placez le haut dans une classe statique visible, et la méthode ajouterUn fonctionnera comme une méthode d'extension à IPADDRESS. Cela facilite le travail avec, et vous n'exposerez pas les détails de l'implémentation de l'ajout à l'adresse IP dans votre classe, tout en conservant la lisibilité. Cela aura l'avantage supplémentaire de ne pas encombrer la classe que vous écrivez déjà avec des méthodes sans rapport possible.

Veuillez voter pour que les personnes qui viennent à cette question puissent le voir si vous êtes d'accord avec ma réponse et les raisons pour lesquelles je ne suis pas d'accord avec la question approuvée.