Utilisation de IcmpSendEcho avec PB 3.94

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Marc
Messages : 32
Inscription : jeu. 29/janv./2004 23:08

Utilisation de IcmpSendEcho avec PB 3.94

Message 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

Anonyme

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

++
Marc
Messages : 32
Inscription : jeu. 29/janv./2004 23:08

Message 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++
Anonyme

Message par Anonyme »

as tu pu tester au bureau?

a++
Marc
Messages : 32
Inscription : jeu. 29/janv./2004 23:08

Message par Marc »

J'ai tester au bureau et celà fonctionne parfaitement
Alors ??????????????
Anonyme

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


@+
Marc
Messages : 32
Inscription : jeu. 29/janv./2004 23:08

Message 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 ?
Anonyme

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

++
Marc
Messages : 32
Inscription : jeu. 29/janv./2004 23:08

Message 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


Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message 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
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

pourquoi avoir utilisé "StringField(sIPAdress,1,"."))"

au lieu de la fonction purebasic "IPAddressField(AdresseIP, Champ)" ? 8O
par souci de complication ? :lol:
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message 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
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message 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:
gansta93
Messages : 1448
Inscription : jeu. 26/févr./2004 11:17
Localisation : Le Village
Contact :

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