Delphi Indy Ping Erreur 10040
J'ai un petit morceau de code qui vérifie si un ordinateur est vivant par la commande ping. Nous utilisons pour avoir une chambre avec 40 ordinateur et je veux vérifier à distance par le biais de mon programme qui est vivant.
Donc j'ai écrit un petit ping fonction à l'aide d'indy
function TMainForm.Ping(const AHost : string) : Boolean;
var
MyIdIcmpClient : TIdIcmpClient;
begin
Result := True;
MyIdIcmpClient := TIdIcmpClient.Create(nil);
MyIdIcmpClient.ReceiveTimeout := 200;
MyIdIcmpClient.Host := AHost;
try
MyIdIcmpClient.Ping;
Application.ProcessMessages;
except
Result := False;
MyIdIcmpClient.Free;
Exit;
end;
if MyIdIcmpClient.ReplyStatus.ReplyStatusType <> rsEcho Then result := False;
MyIdIcmpClient.Free;
end;
J'ai donc développé que chez moi, sur mon réseau wifi et tout simplement beau travail.
Quand je serai de retour pour le travail que j'ai testé et j'obtiens un message d'erreur indiquant que
Socket Errod # 10040 Message too long
Au travail, nous avons IPs fixes et tous les ordinateur et moi sommes dans le même sous-réseau.
J'ai essayé de le déconnecter de l'IP fixe et se connecter à la wifi qui est bien sûr DHCP et pas dans le même sous-réseau, et il est juste de travailler bien.
J'ai essayé de chercher sur internet pour cette erreur et comment la résoudre, mais n'ai pas trouvé beaucoup d'info.
Bien sûr, j'ai essayé de changer la taille par défaut du tampon à une plus grande valeur, mais ça n'a rien changé j'ai toujours l'erreur sur le fixe IP dans le même sous-réseau.
De plus, je ne sais pas si cela peut aider à trouver une solution, mais mon code traite des exceptions, mais dans ce cas, il faut environ 3-4 secondes pour soulever l'erreur alors que le Délai d'attente est fixé à 200 millisecondes. Et je ne peux pas attendre aussi longtemps sur chaque ping.
Par la façon dont j'utilise delphi 2010 et je pense que c'est indy 10. J'ai aussi testé sur les XE2 mais même erreur.
Toute idée
----- EDIT -----
Répondre à cette question, maintenant j'essaie d'avoir ce fonctionnement en multi thread et j'ai posé une autre question pour que
Delphi (XE2) Indy (10) Multithread Ping
ne TidIcmpClient.OnReply appelée ?
j'ai essayé de changer la taille par défaut du tampon à une plus grande valeur Comment exactement ? montrer le code ? Peut-être que vous feriez mieux d'essayer de diminuer la place. Cet exemple une montre à l'aide de l'API Windows pour faire des pings et il taille de la mémoire tampon est de taille des messages qui ont déclaré être trop grand. Delphi Forum est également titulaire de la discussion de IdICMP ping
Ce code a une fuite de mémoire: si une exception se produit, le composant ne sera pas libéré. Et le propriétaire devrait être nul que vous le souhaitez gratuitement le composant lui-même dans la même méthode.
Tu as raison, j'ai Modifier mon code.
OriginalL'auteur HpTerm | 2012-10-04
Vous devez vous connecter pour publier un commentaire.
Définir la
PacketSize
propriété24
:Je ne suis pas tout-ensemble certains pourquoi il fonctionne... mais j'
PacketSize
pour voir si cela accélère le résultat!Vous mettez-vous
AHost
à un nom d'hôte ou une adresse IP? Un nom d'hôte doit être résolu en une adresse IP avant que toutes les données peuvent être envoyées à elle, et que la résolution peut prendre plus de temps si votre machine DNS du sous-système ne fonctionne pas correctement ou est lent. Il n'y a aucun moyen de définir un délai d'attente sur ce nom d'hôte résoudre, car il est juste un simple appel d'API de l'OS. Pour définir un délai d'attente sur elle, vous avez à résoudre le nom d'hôte manuellement à l'aide deTIdDNSResolver
à la place.Comme pour le
PacketSize
, il est de 1024 par défaut. Toutes les données que vous transmettez àPing()
(qui dans ce cas est rien) est utilisé pour remplir l'espacePacketSize
réserves dans le paquet ICMP. Si il n'y a pas de données, l'espace est toujours réservée dans le paquet. Ainsi, la réduction de laPacketSize
réduit la taille globale des paquets ICMP. Les petits paquets ICMP mieux dans les paquets de réseau sna sont donc plus routable.Pour info, la valeur par défaut de la
PacketSize
propriété sera réduite dans un avenir Indy mise à jour pour résoudre ce problème.OriginalL'auteur LaKraven
Pour XE5 et Indy10 c'est toujours un problème, même avec différentes Taille de Paquet.
De répondre le plus cryptical correctif:
C'est une "magie" fix pour contourner le fait qu'il y a un bug dans le Indy10 composant (si j'ai bien compris Remy Lebeau droite).
À mon avis, est que cela a un rapport avec la taille de la mémoire tampon de réception. Pour tester ma théorie, je peux utiliser n'importe quel caractère et n'ont pas besoin d'inclure l'adresse de l'hôte. Uniquement utiliser un nombre de caractère dont vous avez besoin pour le tampon de réception. J'utilise ce petit code (C++ Builder XE5) pour en faire un Ping avec beaucoup de succès (toutes les autres valeurs par défaut):
Comme vous pouvez le voir j'ai créer une chaîne de même longueur que le PacketSize de la propriété. Que vous le remplissez avec est insignifiant.
Peut-être cela peut vous aider à @RemyLebeau quand il travail sur le correctif.
OriginalL'auteur Max Kielland
utiliser ce code
OriginalL'auteur asgarkz