Page 1 sur 2
Utilisation de IcmpSendEcho avec PB 3.94
Publié : jeu. 01/sept./2005 0:11
par Marc
Suite à mon post dans la section Bug, vous trouverez ci-dessous comment utiliser la function IcmpSendEcho (Pour faire un ping) avec PB 3.94
selon les spécification du MSDN concernant le ReplyBuffer.
Voir:
http://msdn.microsoft.com/library/defau ... decho.asp.
J'espère que celà sera utile...
Code : Tout sélectionner
EchoMessage.s = "MVPing make a Ping Test"
ResultSize.l = SizeOf(ICMP_ECHO_REPLY) + Len(EchoMessage)
*Result = AllocateMemory(ResultSize)
*Echo.ICMP_ECHO_REPLY = *Result
If OpenConsole()
ConsoleTitle("MVPing")
Repeat
ConsoleColor(15,0)
Print("Adresse IP: ")
ConsoleColor(10,0)
sIPAddress.s = Input()
PrintN("")
If Len(sIPAddress ) > 0
hFile.l = IcmpCreateFile_()
IPAddress.l=MakeIPAddress(Val(StringField(sIPAddress,1,".")),Val(StringField(sIPAddress,2,".")),Val(StringField(sIPAddress,3,".")),Val(StringField(sIPAddress+".",4,".")))
ConsoleColor(14,0)
For Boucle.l = 1 To 4
lngResult.l = IcmpSendEcho_(hFile, IPAddress, EchoMessage, Len(EchoMessage), 0, *Result, ResultSize, 500)
PrintN("Ping " + sIPAddress + " Octets: " + Str(*Echo\DataSize) + " Temps: " + Str(*Echo\RoundTripTime) + " ms TTL:" + StrU(*Echo\Options\Ttl,#Byte))
Delay(500)
Next
IcmpCloseHandle_(hFile)
EndIf
Until sIPAddress= ""
FreeMemory(*Result)
EndIf
End
Publié : dim. 11/sept./2005 16:11
par Anonyme
cela marche pas tout à fait.
J'ai effectuer des tests avec un gars qui a une connection partagée.
cela marche pas du tout, il me renvois des temps astronomique (10000X trop grand).
sinon avec l'ip de mon fai , ca marche.
++
Publié : dim. 11/sept./2005 20:15
par Marc
Salut,
Bizare, moi je ping les 3 postes de mon réseau et aussi Wanadoo.fr après avoir récupérer son IP.
Demain je ferai un autre test de confirmation sur le réseau de mon job
A++
Publié : mar. 13/sept./2005 11:15
par Anonyme
as tu pu tester au bureau?
a++
Publié : mer. 14/sept./2005 17:31
par Marc
J'ai tester au bureau et celà fonctionne parfaitement
Alors ??????????????
Publié : mer. 14/sept./2005 18:48
par Anonyme
aLors quoi? j'invente rien ^^
il utilise une connection partagée, il n'a pas d'accès direct à internet, il à le pare feu de windobe XP SP2 d'activer , l'ordi qui lui sert de passerelle vers le net à aussi le pare feu de windobe XP SP2 d'activer, cela vient peut etre du sp2, j'avais vu quelque part (je sais plus ou) que le sp2 avait des restriction pour le reseau.
@+
Publié : mer. 14/sept./2005 21:01
par Marc
Désolé, j'ai voulu dire "Alors bizare...)
Ma configuration à la maison:
Netgear avec Modem ADSL + Routeur + WIFI + Switch
1 PC avec XP SP2
1 PC avec XP SP2 en Wifi
1 PC avec Linux
Lors de mes tests mon code affiche les mêmes infos que le ping de Windows.
Le ping fonctionne t'il sur ta configuration ?
Publié : mer. 14/sept./2005 21:10
par Anonyme
oui cela fonctionne parfaitement, je comprend pas d'ou vient cette erreur.
je lui ai donner ton code compilé. il a toujours un ping de fou (10000 fois trop grand, 0 octets, 0 TTL). Je ferais des test avec les ordis de l'armée dans la semaine, mais chuuuuut....
++
Publié : jeu. 29/sept./2005 20:16
par Marc
Voici une version plus complète avec:
1: Affichage des erreurs
2: Résolution URL -> IP (On peut pinguer wanadoo.fr...)
Tester sur un réseau avec 2 PC sous XP SP2 et un poste linux.
Code : Tout sélectionner
Procedure.s ShowError ()
error = GetLastError_ ()
If error
*MyBuffer = AllocateMemory (255)
FormatMessage_ (#FORMAT_MESSAGE_FROM_SYSTEM, #Null, error, 0, *MyBuffer, 255, #Null)
Result.s = "Erreur: " + Str(Error) + " " + PeekS (*MyBuffer)
FreeMemory (*MyBuffer)
ProcedureReturn Result
EndIf
EndProcedure
Procedure.s GetIPByName(ConputerName.s)
If Len(ConputerName) > 0
ResultIP.s=""
high.b = 1: low.b = 1
DefType.w wsaversion
PokeB (@wsaversion, high)
PokeB (@wsaversion + 1, low)
If WSAStartup_ (wsaversion, wsa.WSAData) = #NOERROR ; Try to access Windows sockets stuff...
*host.HOSTENT = gethostbyname_ (ConputerName) ; Get host information for named computer...
If *host <> #Null
While PeekL(*host\h_list + AdressNumber * 4)
IpAddress = PeekL(*host\h_list + AdressNumber * 4)
ResultIP = StrU(PeekB(IpAddress),0)+"."+StrU(PeekB(IpAddress+1),0)+"."+StrU(PeekB(IpAddress+2),0)+"."+StrU(PeekB(IpAddress+3),0)
AdressNumber + 1
Wend
EndIf
WSACleanup_ () ; Close Windows sockets stuff...
EndIf
ProcedureReturn ResultIP
EndIf
EndProcedure
EchoMessage.s = "MVPing make a Ping Test"
ResultSize.l = SizeOf(ICMP_ECHO_REPLY) + Len(EchoMessage)
*Result = AllocateMemory(ResultSize)
*Echo.ICMP_ECHO_REPLY = *Result
If OpenConsole()
ConsoleTitle("MVPing")
Repeat
ConsoleColor(15,0)
Print("Adresse IP: ")
ConsoleColor(10,0)
sIPAdress.s = Input()
PrintN("")
If Len(sIPAdress ) > 0
hFile.l = IcmpCreateFile_()
IPAddress.l=MakeIPAddress(Val(StringField(sIPAdress,1,".")),Val(StringField(sIPAdress,2,".")),Val(StringField(sIPAdress,3,".")),Val(StringField(sIPAdress+".",4,".")))
If IPAdresse = 0
sIPAdress = GetIPByName(sIPAdress)
IPAddress.l=MakeIPAddress(Val(StringField(sIPAdress,1,".")),Val(StringField(sIPAdress,2,".")),Val(StringField(sIPAdress,3,".")),Val(StringField(sIPAdress+".",4,".")))
EndIf
If IPAddress > 0
ConsoleColor(14,0)
For Boucle.l = 1 To 4
If IcmpSendEcho_(hFile, IPAddress, EchoMessage, Len(EchoMessage), 0, *Result, ResultSize, 500) > 0
PrintN("Ping " + sIPAdress + " Octets: " + Str(*Echo\DataSize) + " Temps: " + Str(*Echo\RoundTripTime) + " ms TTL:" + StrU(*Echo\Options\Ttl,#Byte))
Else
PrintN(ShowError())
;MessageRequester("Erreur...",ShowError())
EndIf
Delay(500)
Next
IcmpCloseHandle_(hFile)
Else
PrintN("Impossible de resoudre l'adresse....")
EndIf
EndIf
Until sIPAdress= ""
FreeMemory(*Result)
EndIf
End
Publié : lun. 02/janv./2006 0:01
par Droopy
Je me suis amusé à mettre ton code sous forme de procédure
Code : Tout sélectionner
;/ Author : Marc
Procedure.s HostnameToIP(ConputerName.s)
If Len(ConputerName) > 0
ResultIP.s=""
high.b = 1: low.b = 1
DefType.w wsaversion
PokeB(@wsaversion, high)
PokeB(@wsaversion + 1, low)
If WSAStartup_(wsaversion, wsa.WSAData) = #NOERROR ; Try to access Windows sockets stuff...
*host.HOSTENT = gethostbyname_(ConputerName) ; Get host information for named computer...
If *host <> #Null
While PeekL(*host\h_list + AdressNumber * 4)
IpAddress = PeekL(*host\h_list + AdressNumber * 4)
ResultIP = StrU(PeekB(IpAddress),0)+"."+StrU(PeekB(IpAddress+1),0)+"."+StrU(PeekB(IpAddress+2),0)+"."+StrU(PeekB(IpAddress+3),0)
AdressNumber + 1
Wend
EndIf
WSACleanup_() ; Close Windows sockets stuff...
EndIf
ProcedureReturn ResultIP
EndIf
EndProcedure
Procedure Ping(sIPAdress.s,TimeOut)
;/ Renvoie le temps en ms
;/ Renvoie -1 si hôte inaccessible
;/ Renvoie -2 si la résolution du nom de l'hôte en adresse Ip a échouée
Shared PingTTL
EchoMessage.s = "Ping Test from PureBasic Software"
ResultSize.l = SizeOf(ICMP_ECHO_REPLY) + Len(EchoMessage)
*Result = AllocateMemory(ResultSize)
*Echo.ICMP_ECHO_REPLY = *Result
If Len(sIPAdress ) > 0
hFile.l = IcmpCreateFile_()
IpAddress.l=MakeIPAddress(Val(StringField(sIPAdress,1,".")),Val(StringField(sIPAdress,2,".")),Val(StringField(sIPAdress,3,".")),Val(StringField(sIPAdress,4,".")))
If IPAdresse = 0
sIPAdress = HostnameToIP(sIPAdress)
IpAddress.l=MakeIPAddress(Val(StringField(sIPAdress,1,".")),Val(StringField(sIPAdress,2,".")),Val(StringField(sIPAdress,3,".")),Val(StringField(sIPAdress,4,".")))
EndIf
If IpAddress > 0
If IcmpSendEcho_(hFile, IpAddress, EchoMessage, Len(EchoMessage), 0, *Result, ResultSize, TimeOut) > 0
; PrintN("Ping " + sIPAdress + " Octets: " + Str(*Echo\DataSize) + " Temps: " + Str(*Echo\RoundTripTime) + " ms TTL:" + StrU(*Echo\Options\Ttl,#Byte))
Else
;/ Hôte inaccessible
FreeMemory(*Result)
ProcedureReturn -1
EndIf
IcmpCloseHandle_(hFile)
Else
;/ Nom d'hôte introuvable / inrésolvable
FreeMemory(*Result)
ProcedureReturn -2
EndIf
EndIf
FreeMemory(*Result)
PingTTL=*Echo\Options\Ttl & $000000FF ;/ Car résultat sur un octet
ProcedureReturn *Echo\RoundTripTime
EndProcedure
Procedure Ping_GetTTL() ; Renvoie le TTL du poste pingué avec Ping
Shared PingTTL
ProcedureReturn PingTTL
EndProcedure
#Host="www.voila.fr"
Message.s+#Host+#CR$
Message.s+Str(Ping(#Host,10))+" ms"+#CR$
Message+Str(Ping_GetTTL())+" TTL"
MessageRequester("Ping",Message)
Merci, il va m'être utile

Publié : lun. 02/janv./2006 11:08
par Backup
pourquoi avoir utilisé "StringField(sIPAdress,1,"."))"
au lieu de la fonction purebasic "IPAddressField(AdresseIP, Champ)" ?
par souci de complication ?

Publié : lun. 02/janv./2006 11:56
par Droopy
car (issu de la doc )
Renvoie la valeur du champs de l'adresse ip spécifiée. 'AdresseIP' est un nombre de type long (.l)
et moi j'ai IpAdress en tant que chaine
Publié : lun. 02/janv./2006 12:00
par Backup
ha bah oui !
mais en general les variables chaines vaut mieux leur mettre un "$"
car sinon des mecs comme moi n'y comprennent rien

d'ailleurs plusieurs mois apres , tu devrai avoir des problemes pour t'y retrouver non ?

Publié : lun. 02/janv./2006 13:46
par Droopy
Je préfère définir la variable avec l'extension .s au début du code
Et ensuite je le l'utilise sans le .s
ça fait un caractère en moins à taper

Publié : lun. 02/janv./2006 18:22
par gansta93
Dans ton code, ça serait bien que l'on définisse le msg à envoyer... il me semble que ça n'y est pas, qu'il y a un message prédéfini (je n'ai que survollé le code).