J'ai une application qui pique la gamme IP ou IP. Le problème est que lorsque les hôtes sont fermés, il prend plus de temps à Ping que ce qu'ils sont ouverts. Lorsque l'hôte est fermé, le temps de ping est environ 1-2 secondes.
Comment pourrais-je le rendre plus rapide lorsque les hôtes sont fermés? P>
Ceci est mon code: P>
[DllImport("iphlpapi.dll", ExactSpelling = true)] public static extern int SendARP(IPAddress DestIP, int SrcIP, byte[] pMacAddr, ref uint PhyAddrLen); private void Ping(IPAddress address) { byte[] macAddr = new byte[6]; uint macAddrLen = (uint)macAddr.Length; if (SendARP(address, 0, macAddr, ref macAddrLen) == 0) { txtDisplay.AppendText("Host " + address + " is open." + Environment.NewLine); } else txtDisplay.AppendText("Host " + address + " is closed." + Environment.NewLine); }
5 Réponses :
Je ne sais pas si C'est une aide (voir la publication finale sur le thread ), il semble un problème presque identique. Ce que vous achetez contre il y a le délai d'attente de la pile de protocole. Vous pouvez le contourner si vous utilisez une prise pour vous connecter car vous aurez plus de contrôle. P>
Vous devez redéfinir votre application pour utiliser Multhreading -> Tâches. Émettez une tâche pour chaque ping, et lorsque vous recevez une réponse d'un événement d'hôte donné, un événement et mettez à jour l'interface utilisateur. Modification du délai d'attente de socket ne vous aidera que de réduire le délai d'expiration de scandaleux à insupportable. p>
Je suppose que cela pourrait être fait. Mais je n'ai pas fait beaucoup de filetage en C #. Y a-t-il une solution plus simple?
@HelpneEder - Utilisez la méthode de votre utilisation maintenant. Si vous le souhaitez «plus rapide», vous devez utiliser plusieurs threads.
Votre adresse est une chaîne Je vous suggère d'utiliser la surcharge prenant un code>. Ainsi, cela ira d'abord via DNS pour voir s'il s'agit éventuellement d'un nom d'hôte (même s'il s'agit d'une adresse IP). P>
iPaddress code> à la place. p>
Vous ne devriez pas réduire le délai d'attente. Essayez d'envoyer plusieurs pings à une fois async.
J'ai créé un scanner d'hôte en direct il n'y a pas si longtemps. Il utilise ARP pour vérifier si un ordinateur est en ligne.
Une demande ARP est beaucoup plus rapide que si vous avez ping d'hôte.
Voici le code que j'ai utilisé pour vérifier si un hôte est disponible: si vous êtes intéressé NMAP utilise également cette technique pour numériser les hôtes disponibles. P> Scan ARP met le NMAP et ses algorithmes optimisés en charge des demandes ARP. Et s'il reçoit une réponse en arrière, NMAP n'a même pas besoin de s'inquiéter des paquets Ping basés sur IP, car il connaît déjà l'hôte est en hausse. Cela rend l'analyse ARP beaucoup plus rapidement et plus fiable que les analyses IP. Il est donc fait par défaut lorsque Numéring Ethernet héberge que NMAP détecte figure sur un réseau Ethernet local. Même si différents types de ping (tels que -Pe ou -ps) sont spécifiés, NMAP utilise ARP plutôt que pour l'une des cibles figurant sur le même réseau local. P>
BlockQuote> Edit: p> Ceci fonctionne uniquement dans le sous-réseau actuel! Tant qu'il n'y ait pas de routeur entre la machine demandeur et la cible, cela devrait fonctionner correctement. P> ARP est un protocole non routable et ne peut donc être utilisé que entre les systèmes sur le même réseau Ethernet. [...]
ARP-SCAN peut être utilisé pour découvrir des hôtes IP sur le réseau local. Il peut découvrir tous les hôtes, y compris ceux qui bloquent tous les trafic IP, tels que des pare-feu et des systèmes avec des filtres d'entrée. - extrait de NTA-Monitor Wiki P>
blockQquote> Pour plus d'informations sur la fonction Sendarp, vous pouvez consulter le pinvoke.net. documentation. P> p>
Eh bien, pour une raison quelconque, je reçois toujours un faux résultat. même sur des adresses IP en vie.
Qu'est-ce qu'un hôte fermé? Aussi pourquoi ne pas simplement faire le délai d'attente comme 2 secondes au lieu de 120?
@Leppie, en disant l'hôte fermé, je voulais dire que l'IP ne répond pas à Ping ou est en panne. Le changement de temps ne change rien. J'ai essayé.
Qu'avez-vous changé le délai d'attente?
En outre, quel est l'intervalle de tick? Trop de variables ici :(
@leppie, j'ai essayé
int tempsout = 1; code>, et il semble qu'il n'y ait que peu de différence quand il est défini sur 120. Intervalle J'essaie à 1 milliseconde. MDR
L'intervalle de minuterie ne doit pas être inférieur à 10 ms, le reste du code pourrait ne jamais éventuellement rattraper et les ressources seront épuisées, etc.
@leppie, oui et non. Je veux ping vite. Ce code ne semble pas consommer beaucoup de mémoire / cpu. Surtout lorsque les hôtes sont inaccessibles.
OK le code que vous avez maintenant est presque correct. Essayez de remplacer le si avec -> if (sendarp ((Sendarp ((int) adresse.Address, 0, macaddr, refa macaddrlen) == 0)
@ R34LThing, la modification du code sur vos spécifications ne fonctionne pas. Il compile mais quand je ping n'importe quelle adresse IP, il continue de montrer que chaque IP est en panne.