Bonjour à tous, et très bonne année 2019 !
Je me permet de venir poser ma question ici, car je n'arrive pas à trouver de solution adéquate, pour un soucis pourtant simple...
Mon application contient une textbox dans laquelle un hostname ou une ip doit être rentrée. Si le poste répond au ping, alors plusieurs informations sont "peuplées" dans l'interface, et des menus deviennent accessible. Dans le cas contraire, et bien il est juste affiché que le poste est hors ligne. Seulement, si le poste ne répond pas, le retour du ping met trop longtemp à parvenir à l'application.
Comment faire pour avoir un retour très rapide, même en cas d'échec de ping ?
J'ai essayé plusieurs choses. Déjà ceci :
Mais également malgré tout en multithreading pour éviter un blocage de l'appli :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 public static bool GetPing(string hostname) { bool pingable = false; try { Ping pingSender = new Ping(); PingOptions options = new PingOptions(); options.DontFragment = true; string data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; byte[] buffer = Encoding.ASCII.GetBytes(data); int timeout = 120; PingReply reply = pingSender.Send(hostname, timeout, buffer, options); if (reply.Status == IPStatus.Success) { pingable = true; } } catch (Exception ex) { pingable = false; Console.WriteLine(ex.Message); } return pingable; }
Ce dernier bout de code fonctionne, et me retourne un résultat rapidement, même en cas d'echec, mais quelque secondes plus tard, VisualStudio m'indique une Exception non gérée "SocketException : Unknown host", alors que je gère toutes les exceptions... En fait, j'ai l'impression que malgré le résultat qui m'est retourné (ping ok ou pas), et bien le ping continue en arrière plan.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 public static bool GetPing(string hostname) { if (hostname == null || hostname == string.Empty) { return false; } bool pingable = false; try { Func<PingReply> pingDelegate = () => new Ping().Send(hostname); IAsyncResult result = pingDelegate.BeginInvoke(r => pingDelegate.EndInvoke(r), null); result.AsyncWaitHandle.WaitOne(100); pingable = result.IsCompleted; } catch (FormatException fe) { Console.WriteLine("FormatException" + fe.Message); return false; } catch (SocketException se) { Console.WriteLine("PingException" + se.Message); return false; } catch (NotSupportedException nse) { Console.WriteLine("NotSupportedException" + nse.Message); return false; } catch (Exception e) { Console.WriteLine("Exception" + e.Message); return false; } return pingable; }
Pour finir, j'ai l'impression que le retour est très long uniquement en cas d'utilisation de nom d'hôte, mais afin de la convertir en ip, j'ai besoin d'effectué un ping dessus... Un cercle vicieux
Quelqu'un peut m'orienter svp ?
Merci bcp par avance.
Partager