Constructeur IPAdress

Résolu
Xdjibi Messages postés 5 Date d'inscription mercredi 29 novembre 2000 Statut Membre Dernière intervention 14 octobre 2005 - 13 oct. 2005 à 21:29
Xdjibi Messages postés 5 Date d'inscription mercredi 29 novembre 2000 Statut Membre Dernière intervention 14 octobre 2005 - 14 oct. 2005 à 21:51
Bonsoir,



Je lutte un peu (doux euphémisme!) avec le constructeur de la classe IPAddress.



MSDN Library donne trois constructeurs pour IPAddress :






<ol>
<li>Initializes a new instance of the IPAddress class with the specified address and scope equal to 0 :

[C#] [http://msdn.microsoft.com/library/en-us/cpref/html/frlrfsystemnetipaddressclassctortopic1.asp public IPAddress(byte[]);]</li>
<li>Initializes a new instance of the IPAddress class with the specified address (Supported by the .NET Compact Framework) :

[C#] public IPAddress(long);http://msdn.microsoft.com/library/en-us/cpref/html/frlrfsystemnetipaddressclassctortopic2.asp</li>
<li>Initializes a new instance of the IPAddress class with the specified address and scope :

[C#] [http://msdn.microsoft.com/library/en-us/cpref/html/frlrfsystemnetipaddressclassctortopic3.asp public IPAddress(byte[], long);]</li>
</ol>

Je souhaite instancier une adresse de type IPv4. J'ai choisi le premier constructeur :

byte[] tab = new byte[4];

tab[0] = 192;

tab[1] = 168;

tab[2] = 0;

tab[3] = 1;



IPAddress monIP = new IPAddress(tab);



Et là, je me prends une superbe exception en pleine tête :



************** Exception Text **************

System.ArgumentException: address

at System.Net.IPAddress..ctor(Byte[] address, Int64 scopeid)

at System.Net.IPAddress..ctor(Byte[] address)

at Demo_Adapter.SOCKET_ADDRESS.getIpAddress()

at Demo_Adapter.MainForm.btnInfos_Click(Object sender, EventArgs e)

at System.Windows.Forms.Control.OnClick(EventArgs e)

at System.Windows.Forms.Button.OnClick(EventArgs e)

at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)

at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)

at System.Windows.Forms.Control.WndProc(Message& m)

at System.Windows.Forms.ButtonBase.WndProc(Message& m)

at System.Windows.Forms.Button.WndProc(Message& m)

at System.Windows.Forms.ControlNativeWindow.OnMessage(Message& m)

at System.Windows.Forms.ControlNativeWindow.WndProc(Message& m)

at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)





J'ai du mal à comprendre comment je peux utiliser ces constructeurs.

Quand je vois le paramètre scopeid, j'ai l'impression que ça concerne les adresses IPv6.

Si quelqu'un a un élément de réponse, une idée, une suggestion, ce sera bienvenu!



Merci par avance,

Ghislain

9 réponses

sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
14 oct. 2005 à 10:36
ce que je te propose... c'est transformer ton tableau de byte en long...

exemple :


private
long BytesToLong(
byte[] bytes) {

long ret = 0;

long power = 1;

int i=0;

for (i=0; iSébastien FERRAND
[MVP C#]
3
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
13 oct. 2005 à 22:03
Utilises plutot IPAddress.Parse("192.168.0.1");

Mx
0
Xdjibi Messages postés 5 Date d'inscription mercredi 29 novembre 2000 Statut Membre Dernière intervention 14 octobre 2005
13 oct. 2005 à 22:15
En fait, c'est ce que je voulais éviter. Ca marche parfaitement avec
Parse(string). Sauf que je récupère un tableau de byte initialement.
Plus exactement un pointeur en provenance de l'ip-helper que je caste
en byte.



Si j'utilise la Méthode Parse, il faut que je me coltine la
transformation en string pour pouvoir enfin instancier mon IPAddress.
Or j'utilisais cette classe justement pour sa méthode ToString()!



Merci pour ta réponse MX.



Quelqu'un a déjà utilisé les constructeurs de la classe IPAddress?
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
14 oct. 2005 à 07:22
Salut, ca passe en .NET 2.0 et en .NET 1.1 il faut passer un tableau de 16 bytes. ( à vérifier ).
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
t_barbillon Messages postés 341 Date d'inscription mercredi 8 juin 2005 Statut Membre Dernière intervention 10 février 2009 2
14 oct. 2005 à 08:44
Salut, juste une question à Xdjibi tu utilises quoi pour rcuperer ton adresse IP ? L'API de iphlpapi.dll ?
0
Xdjibi Messages postés 5 Date d'inscription mercredi 29 novembre 2000 Statut Membre Dernière intervention 14 octobre 2005
14 oct. 2005 à 09:14
Bonjour et merci pour ta reponse,

J'ai effectivement tente en desespoir de cause hier soir de passer un tableau de 16 bytes. Plus d'exception a l'instanciation mais une autre superbe a l'utilisation de la methode ToString() dessus. Je ne suis pas devant ma machine donc difficile de memoire de me souvenir exactement de quoi il retourne, mais je m'y colle des ce soir.

Mon probleme devient alors : comment initialiser mon tableau de 16 bytes puisque mon adresse IPv4 n'en contient que 4?

L'autre solution j'imagine, serait de passer a .Net. Mais je ne sais pas ce que cela implique...

t_barbillon : J'utilise effectivement l'API de iphlpapi.dll a grand renfort de pointeurs!
0
t_barbillon Messages postés 341 Date d'inscription mercredi 8 juin 2005 Statut Membre Dernière intervention 10 février 2009 2
14 oct. 2005 à 09:41
Ok, en fait j'ai un problème avec l'api GetForwardIpTable tu ne l'utiliserais pas par hasard ?
0
Xdjibi Messages postés 5 Date d'inscription mercredi 29 novembre 2000 Statut Membre Dernière intervention 14 octobre 2005
14 oct. 2005 à 10:14
t_barbillon : Non, pas encore. Quel est ton probleme?
0
Xdjibi Messages postés 5 Date d'inscription mercredi 29 novembre 2000 Statut Membre Dernière intervention 14 octobre 2005
14 oct. 2005 à 21:51
Bonsoir,



Allez savoir pourquoi, le constructeur acceptant un entier long fonctionne.

Merci donc pour ce conseil!

Juste une question, Sébastien :

Si j'ai bien retenu mes leçons de C#, unchecked permet de définir des
zones dans lesquelles le contrôle de dépassement de capacité est désactivé.



Pourquoi l'utiliser dans l'appel du constructeur?


J'aurais été tenté de l'utiliser au moment de l'affectation dans la
boucle (voir exemple ci-dessous). Suis-je encore une fois à côté de mes
pompes?



private
long BytesToLong(
byte[] bytes) {

long ret = 0;

long power = 1;

int i=0;

unchecked {


for (i=0; i return ret;
}

Voire même :





for (i=0; i(power *
256);


}



Avis aux experts...

Merci et bonne nuit!
0
Rejoignez-nous