Non sur le reseau interne de ma boite ...
Edit : je suis pas vraiemenbt convaincu par les methodes asnyc. J'en utilise aussi une d'ailleur une autre : Dns.BeginGetHostEntry(obj, callBack, obj)
Certes ca ne bloque pas l'application mais j'ai l'impression que ca me la fait planter. En tout cas je pense que je ne sais rien gerer du tout .
Pour que je puisse voir correctement le programme s'executer je suis obliger de mettre un point d 'arret sur toutes les lignes sinon il passe pas la ou je veux. Le programme peu s'arreter sur un Else ou un End Sub... Est-ce que le fait que dans certains car pour recuperer la valeur d'une variable dans une methode async l'utilisation d'un RaiseEvent(ma variable) peut etre la cause de tous mes maux ?
Apres plusieurs reglages et test il semble que ceci foncitonne :
Avec un long sleep je parviens a recuperer exacetement ce que je veux.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 For i As Integer = 0 To (machines.Count - 1) Dim p As New System.Net.NetworkInformation.Ping AddHandler p.PingCompleted, AddressOf ping_end p.SendAsync(machines(i), 102, machines(i)) Thread.Sleep(10000) Next
Il n'y a t il pas moyent de faire autrement ? Si j'ai 40 hostnames a controler je vais pas faire une pause de 10sec entre chaque ping, si ?
He ben ... moi sans delais, avec seulement deux hostname je recupere rien dans mon dictionnaire....
Helas non je fais ca pour l'instant sur un reseau local qui n'est pas un reseau de test et dans ma salle de test c'est different je n'ai pas autant de machine a pinger...Envoyé par Pol63
tu peux tenter l'approche moins évasive avec un thread par ping, et l'appel du ping synchrone, tu auras moins de chance de perdre des trucs (avec une sub de thread avec un paramètre as object, à convertir en string, et un try catch dedans)
éventuellement délayer avec un sleep (2) entre chaque démarrage de thread
J'ai suivit ton conseil et ca marche.
J'ai fait une classe dite thread_ping pour gerer le ping.sync dans laquelle je demarre un thread dans le constructeur qui appele cette fonction :
Ensuite dans ma classe principale je fais :
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 Private Sub ping(ByVal obj As Object) Dim ip As New String(obj) Try Dim p As New System.Net.NetworkInformation.Ping Dim ping_reply = p.Send(ip, 102) If ping_reply.Status = NetworkInformation.IPStatus.Success Then hostip = ip etat = true Else hostip = ip etat = false End If Catch ex As NetworkInformation.PingException hostip = ip etat = false End Try End Sub
Dans les deux classe thread : threadPing et le thread_hostEntry je ne fais pas de Thread.Sleep(2)
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
40
41
42
43
44
45 Private Function listMachine(ByVal ipOuHostname As List(Of String)) As List(Of machine) Dim lmachine As New List(Of host) Dim machine As machine start_time = Now For Each ip In ipOuHosname dim p = New thPing(ip) machine = New machine() If p.isOnline Then ' je recupere l'ip et le hostname ' du thread hostnameEntry dim he = new thread_he(ip) machine.hostname = he.hostname machine.ip = he.ip Else machine.etat = p.isOnline if isIPv4(ip) then machine.ip = p.ip else machine.hostname = p.ip endif End If lmachine.Add(host) Next stop_time = Now elapsed_time = stop_time.Subtract(start_time) Console.WriteLine(elapsed_time.TotalSeconds.ToString("0.000000")) Return rlhost End Function
Comme tu peux le voir je mesure egalement le temps d'execution de la fonction.
Temps d'execution :
- Avec 7 ips : 16,036828
- Avec 100 ips : 55,177297
Il y a-t-il moyen de reduire ce delais ?
je sais pas on a pas tout le code et il y a du code inutile à la compréhension
mon chef à l'habitude de dire de faire un bout de code simple qui fonctionne avant de l'intégrer dans le reste du modèle
en l'occurrence je viens de tester ca :
et en moins d'une seconde j'ai pingé toute ma plage
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 Private Sub Form1_Click(sender As Object, e As System.EventArgs) Handles Me.Click For i As Integer = 1 To 254 Dim th As New Threading.Thread(AddressOf ping) th.Start("192.168.0." & i.ToString) Next Me.Text = "all started" End Sub Private Sub ping(s As String) Try Dim p As New Net.NetworkInformation.Ping Dim r = p.Send(s, 150) Me.Invoke(New Action(Sub() append(r.Status.ToString & " " & s))) Catch ex As Exception Me.Invoke(New Action(Sub() append("err " & s))) End Try End Sub Private Sub append(s As String) Me.ListBox1.Items.Add(s) End Sub
Quel code est inutile a la comprehension ?
Chez moi ta fonction marche aussi. Est-ce que tu pense que je peux recuperer les ip dans une varialbe dont le ping a eu un timeout ou ce n'est pas possible? Ou alors je me contente des ip qui on pu etre pinger et refaire une verif dans ma liste complete en comparant avec le resultat?
Edit : je pense que j'ai le defaut de trop compliquer dans ma facon de penser le algos... J'arrive a avoir ce que je veux avec un ping entre 1sec et moins d 'une seconde. J'ai definit un status de machine par defaut a non joignable avant le ping et lors du ping si ca marche je met le status a joignable sinon je fais rien.
A noter aussi que le fait d'avoir mis apres le Thread.start un Thread.join() me ralenti considerablement l'execution car il attend que chaque thread se termine.
je sais pas j'avais envie de dire ca ^^
tout est possible
tu peux faire un thread global qui lance les threads et fait un .join dessus, comme ca tu sais quand tout est fini, tu peux donc voir une collection dont tu es sur que l'état est mis à jour pour toutes les ip
sinon tu peux aussi avec un status "en cours" et faire un timer qui met à jour l'interface en fonction de la collection
je veux bien chercher voir si j'y arrive.
Donc si j'ai bien compris, il faudrait que je creer un thread principal qui englobe mon thread de ping et celui qui me recupere le hostentry ?
Schematisation:
Main Thread
--> Appel du Ping Thread
Si ping ok :
---> Appel du thread get.hostentry
mainThread.join()
je me demande si un thread pour recuperer l'ip associee au hostname et vise versa est-il bien utile .... J#ai fais ca en pensant que je pourrais utiliser independament le ping et le hosstentry mais en fait les deux sont souvent associes.
quelques secondes :
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
40
41
42
43
44
45
46
47
48 Private Sub Form1_Click(sender As Object, e As System.EventArgs) Handles Me.Click Dim th As New System.Threading.Thread(AddressOf MainThreadPingHostName) th.Start() End Sub Private Sub MainThreadPingHostName() Dim threads As New List(Of Threading.Thread) For i As Integer = 1 To 254 Dim th As New Threading.Thread(AddressOf ping) th.Start("192.168.0." & i.ToString) threads.Add(th) Next For Each th In threads th.Join() Next Me.Invoke(New Action(Sub() For Each s As String In collection Me.ListBox1.Items.Add(s) Next End Sub)) End Sub Dim collection As New List(Of String) Private Sub ping(s As String) Try Dim p As New Net.NetworkInformation.Ping Dim r = p.Send(s, 150) If r.Status = Net.NetworkInformation.IPStatus.Success Then collection.Add(r.Status.ToString & " " & s & " " & System.Net.Dns.GetHostEntry(s).HostName) Else collection.Add(r.Status.ToString & " " & s) End If Catch ex As Exception collection.Add("err " & s) End Try End Sub Private _verrou As New Object Private Sub AddToCollectionThreadSafe(s As String) SyncLock _verrou collection.Add(s) End SyncLock End Sub
Je n'avais pas pense au Synlock et je pense que c'est une erreur typique de debutant. Autre question : puis-je creer une classe pour gerer le ping et creer un thread dans mon programme principal qui fera appel au thread du ping ?
Quelque chose comme :
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
40 Sub Main() Dim threadPing a new thPing() Dim th As New System.Threading.Thread(AddressOf threadPing.MainThreadPingHostName) th.Start(ip) end Sub Public Class thPing ...... public sub MainThreadPingHostName(byval obj as Object) Dim threads As New List(Of Threading.Thread) For i As Integer = 0 To (kassen.Count - 1) Dim th As New Threading.Thread(AddressOf ping) th.Start(kassen(i)) threads.Add(th) Next For Each th In threads th.Join() Next end sub private Sub ping(...) ..... end Sub ..... End Class
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager