faire un ping dans purebasic

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
supercdfr
Messages : 105
Inscription : sam. 21/juil./2007 15:16

faire un ping dans purebasic

Message par supercdfr »

Bonjour,

je cherche a faire un ping dans purebasic, SANS passer par la commande dos ping.

est-ce realisable ?
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Re: faire un ping dans purebasic

Message par Progi1984 »

Recherche du côté de ICMP.
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Re: faire un ping dans purebasic

Message 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


supercdfr
Messages : 105
Inscription : sam. 21/juil./2007 15:16

Re: faire un ping dans purebasic

Message 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"
Avatar de l’utilisateur
cederavic
Messages : 1338
Inscription : lun. 09/févr./2004 23:38
Localisation : Bordeaux

Re: faire un ping dans purebasic

Message par cederavic »

je ne sais pas si ça fonctionnera mais essay de remplacer tout les .l par des .i
supercdfr
Messages : 105
Inscription : sam. 21/juil./2007 15:16

Re: faire un ping dans purebasic

Message 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
Répondre