Heu gros probleme logique et algorithme

Signaler
Messages postés
74
Date d'inscription
lundi 23 mai 2005
Statut
Membre
Dernière intervention
5 décembre 2008
-
Messages postés
74
Date d'inscription
lundi 23 mai 2005
Statut
Membre
Dernière intervention
5 décembre 2008
-
"hello world !"
voila jai un "petit" probleme, j'ai créé un code qui me permet de faire un traceroute a partir dun ping, avec un Ttl de 1 et en l'augmentant de 1 a chaque routeur traversé.
bref, jai dans mon code une erreur, lorsque quand je fait un tracert ca indique "*",ici ca bloque lors de l'affectation de adr_passerelle=reply.Adress.ToString(); , car cette valeur ne peut pas etre nulle, alors, j'ai mis une condition "if" mais le probleme cest :
>> lorsque jexcécute le programme, ca me dit erreur a la ligne adr_passerelle et ca ne méxcécute pas le "if" cat il est placé aprés, et si je le place avant, adr_passerelle ne sera pas connue.
voila, ca fait 3jours que je suis dessus, j'en peux plus la..
SVP aidez moi...



string adr_passerelle = reply.Address.ToString();



long round_trip_time = reply.RoundtripTime;


if (adr_passerelle "") adr_passerelle
"*";



MessageBox.Show(
"reply.Adress test = " + adr_passerelle,
"reply.adress",
MessageBoxButtons.OK,
MessageBoxIcon.Error);

15 réponses

Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
98
Salut,

Ton problème c'est que reply.Address vaut null, donc l'appel de ToString() échoue.

if ( reply.Address != null )
{
string adr_passerelle = reply.Address.ToString();
long round_trip_time = reply.RoundtripTime; if (adr_passerelle "") adr_passerelle "*";
MessageBox.Show("reply.Adress test = " + adr_passerelle, "reply.adress", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
else
{
// ...
}

/*
coq
MVP Visual C#
*/
Messages postés
794
Date d'inscription
vendredi 24 septembre 2004
Statut
Membre
Dernière intervention
19 août 2008
10
Je ne suis pas sur que ton if puisse résoudre le problème : il y a une différence entre 'null' et ""... Le premier concerne un objet, le second une chaine vide.

Je pense plutot que ton erreur viens :
- soit de l'objet 'reply', qui est null lorsque tu arrive à la ligne qui plante
- soit de l'objet 'reply.Address' qui est null lui aussi a ce moment la...

Tu devrais trouver cette erreur très rapidement en débuguant, sinon essaye deja de mettre cela :

adr_passerelle = "*";
if(reply != null)
{
if(reply.Address != null)
{
adr_passerelle = reply.Address.ToString();
}
}

long round_trip_time [...]
Messages postés
794
Date d'inscription
vendredi 24 septembre 2004
Statut
Membre
Dernière intervention
19 août 2008
10
(arf pas assez rapide ^^)
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
98
4s de différence...je crois qu'on a pas fait pire encore ;-)

Sinon effectivement je n'ai pas penser à reply, ça me parressait évident qu'il ne soit pas null mais ça peut être le cas.
Cependant ton test peut être raccourci :
if(reply != null)
{
if(reply.Address != null)
{
adr_passerelle = reply.Address.ToString();
}
}

devient

if(reply != null && reply.Address != null)
{
adr_passerelle = reply.Address.ToString();
}

:-)

/*
coq
MVP Visual C#
*/
Messages postés
74
Date d'inscription
lundi 23 mai 2005
Statut
Membre
Dernière intervention
5 décembre 2008

Voici mon code en un peu plus complet :
args cest l'argument que je met, l'adresse Ip de destination..
Le probleme cest dans le Else, il faudrait que j'arrive a mettre que le reply.Adress soit égal a "*" et non a null

if (reply.Address !=
null)


{



string adr_passerelle = reply.Address.ToString();
//adresse de passerelle



long round_trip_time = reply.RoundtripTime;
//durée en ms de la requete ping


if (adr_passerelle "") adr_passerelle
"*";



MessageBox.Show(
"reply.Adresse = "+ adr_passerelle,
"Fin",
MessageBoxButtons.OK,
MessageBoxIcon.Exclamation);



if (args == reply.Address.ToString())
break;



if (args == adr_passerelle)
MessageBox.Show(
"args=adresse_passerelle",
"Fin",
MessageBoxButtons.OK,
MessageBoxIcon.Information);


}






else
// reply.adress == null


{



string adr_passerelle = reply.Address.ToString();



long round_trip_time = reply.RoundtripTime;


if (adr_passerelle "") adr_passerelle "*";



MessageBox.Show(
"reply.Adress test = " + adr_passerelle,
"reply.adress",
MessageBoxButtons.OK,
MessageBoxIcon.Error);


}



Ttl++;


options.Ttl += 1;


}

voici lerreur générée :

Merci
Messages postés
794
Date d'inscription
vendredi 24 septembre 2004
Statut
Membre
Dernière intervention
19 août 2008
10
Dans ce cas, si reply.Address est null et que tu ne veux pas qu'il le soit... il te faut le récréer :

Si c'est reply qui est null :
reply = new JeSaisPasQuoi();

Si c'est reply address :
reply.Address = new JeSaisPasQuoi();

Tout dépend du type de replyAddress...
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
98
On ne peut pas voir ton image, elle est locale à ta machine.

/*
coq
MVP Visual C#
*/
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
98
* est censé représenter quoi ?
"N'importe quelle adresse" ?

/*
coq
MVP Visual C#
*/
Messages postés
74
Date d'inscription
lundi 23 mai 2005
Statut
Membre
Dernière intervention
5 décembre 2008

non, * cest pareil que lorsqu'on fait un traceroute sous le shell, lorsque l'on ne peut pas joindre l'hote, ca met *, ici cest pareil, lorsque Reply.Adress == null alors Reply.Adress. devrait prendre cette valeur "*".
Messages postés
794
Date d'inscription
vendredi 24 septembre 2004
Statut
Membre
Dernière intervention
19 août 2008
10
De quel type est ton objet 'reply' ?
Messages postés
74
Date d'inscription
lundi 23 mai 2005
Statut
Membre
Dernière intervention
5 décembre 2008

voici :

Ping pingSender =
new
Ping();

PingOptions options =
new
PingOptions();
options.DontFragment =
true;
options.Ttl = Ttl;

string data =
"bonjour ceci est le string data ";
b
yte[] buffer =
Encoding.ASCII.GetBytes(data);

int timeout = 120;



PingReply reply = pingSender.Send(args, timeout, buffer, options);
Messages postés
74
Date d'inscription
lundi 23 mai 2005
Statut
Membre
Dernière intervention
5 décembre 2008

voici je met tout comme ca..:

Ping pingSender =
new
Ping();

PingOptions options =
new
PingOptions();
options.DontFragment =
true;
options.Ttl = Ttl;

string data =
"bonjour ceci est le string data ";
b
yte[] buffer =
Encoding.ASCII.GetBytes(data);

int timeout = 120;



PingReply reply = pingSender.Send(args, timeout, buffer, options);
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
98
Dans le cas de la commande, * est juste une représentation graphique.
Une instance d'IPAddress ne peut pas prendre cette valeur, par contre tu peux probablement te servir du champs statique None pour représenter *.

/*
coq
MVP Visual C#
*/
Messages postés
794
Date d'inscription
vendredi 24 septembre 2004
Statut
Membre
Dernière intervention
19 août 2008
10
reply.Address est de type IpAddress, donc tu peux essayer cela :

if(reply.Address == null)
{
reply.Address = new IPAddress(IPAddress.Broadcast);
}

Ce qui te metra une adresse de broadcast...

Mais je ne sais pas si c'est que tu cherches en fait.... Tu ne peux pas mettre "*" dans une adresse IP. Si le "*" te sert a détecter comme tu le dis que l'hote n'est pas joignable... et bien dans ce cas laisse ton code comme il est :

si reply.Address == null >> alors l'hote n'est pas joignable et tu fait le traitement que tu dois faire dans ce cas.
Messages postés
74
Date d'inscription
lundi 23 mai 2005
Statut
Membre
Dernière intervention
5 décembre 2008

est-ce que tu peux m'expliquer un peu plus ? dsl de t'embéter avec tout ca, mais moi et la programmation ca fait plus de 2...merci