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.... :lol:

++

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 :D

Publié : lun. 02/janv./2006 11:08
par Backup
pourquoi avoir utilisé "StringField(sIPAdress,1,"."))"

au lieu de la fonction purebasic "IPAddressField(AdresseIP, Champ)" ? 8O
par souci de complication ? :lol:

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 ! :D

mais en general les variables chaines vaut mieux leur mettre un "$"
car sinon des mecs comme moi n'y comprennent rien :D
d'ailleurs plusieurs mois apres , tu devrai avoir des problemes pour t'y retrouver non ? 8O

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 :wink:

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).