Page 1 sur 1
faire un ping dans purebasic
Publié : mar. 26/janv./2010 11:43
par supercdfr
Bonjour,
je cherche a faire un ping dans purebasic, SANS passer par la commande dos ping.
est-ce realisable ?
Re: faire un ping dans purebasic
Publié : mar. 26/janv./2010 12:11
par Progi1984
Recherche du côté de ICMP.
Re: faire un ping dans purebasic
Publié : mar. 26/janv./2010 21:47
par Droopy
Ce code pourrait te servir ?
Code : Tout sélectionner
;/ PureBasic 4 Beta 3
Structure Enregistrement
Avertir.b
Nom.s
IP.s
Description.s
Statut.s
EchecSi.s
Duree.l
UniteDuree.s
TypeInterrogation.s
Port.l
TimeOut.l
TimerId.l
EndStructure
ProcedureDLL IPNum(IPAdress.s) ; Return a numerical IP Adress from a IPString
IpAddress.l=MakeIPAddress(Val(StringField(IPAdress,1,".")),Val(StringField(IPAdress,2,".")),Val(StringField(IPAdress,3,".")),Val(StringField(IPAdress,4,".")))
ProcedureReturn IpAddress
EndProcedure
ProcedureDLL.s HostnameToIP(ConputerName.s) ; Return as a String
If Len(ConputerName) > 0
ResultIP.s=""
high.b = 1: low.b = 1
Define wsaversion.w
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_addr_list + AdressNumber * 4)
IpAddress = PeekL(*host\h_addr_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
ProcedureDLL Ping(sIPAdress.s,TimeOut=500)
;/ 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
Message.s="PING from PureBasic"
ResultSize.l = SizeOf(ICMP_ECHO_REPLY) + Len(Message)
*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, Message, Len(Message), 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)
;/ Définition variables partagées
PingTTL=*Echo\Options\Ttl & $000000FF ;/ Car résultat sur un octet
ProcedureReturn *Echo\RoundTripTime
EndProcedure
Temps=Ping("www.voila.fr")
Select Temps
Case -2
MessageRequester("Ping","Echec résolution de noms")
Case -1
MessageRequester("Ping","Hôte injoignable")
Default
MessageRequester("Ping",Str(Temps)+" ms")
EndSelect
Re: faire un ping dans purebasic
Publié : mer. 27/janv./2010 12:04
par supercdfr
Ca fonctionne comme je le desire en x86.
Par contre, avec purebasic X64, ca ne fonctionne pas. C'est pas bien grave, mais une idée de son non foncitonnement. Ca mets directement "hote injoignable"
Re: faire un ping dans purebasic
Publié : jeu. 28/janv./2010 22:27
par cederavic
je ne sais pas si ça fonctionnera mais essay de remplacer tout les .l par des .i
Re: faire un ping dans purebasic
Publié : lun. 22/mars/2010 19:37
par supercdfr
Petit soucis.
toutes les adresses ip avec le dernier chiffre au dessus de 127, cela ne fonctionne pas. Il ne va meme pas chercher a les pinguer.
J'ai remarqué qu'il passait le numero ip en negatif.
edit : trouve.
il fallait mettre If IpAddress <> 0 au lieu de If IpAddress > 0