Page 1 sur 1

reponse a un ping sans pointeur

Publié : jeu. 15/nov./2012 14:34
par supercdfr
Bonjour

J'ai trouvé ce code sur le forum anglais :

Code : Tout sélectionner

Procedure TestInetConnection()
  SendData$ = "Test"
  ReplyBuffer$ = Space(SizeOf(ICMP_ECHO_REPLY) + Len(SendData$) + SizeOf(character))
  hIcmpFile = IcmpCreateFile_()
  dwRetVal = IcmpSendEcho_(hIcmpFile, inet_addr_("192.168.0.1"), @SendData$, Len(SendData$), #Null, @ReplyBuffer$, Len(ReplyBuffer$) + SizeOf(ICMP_ECHO_REPLY), 1000)

  If dwRetVal
    ProcedureReturn 1
  Else
    ProcedureReturn 0
  EndIf
 
EndProcedure

Debug TestInetConnection()
Il est très bien, mais est-il possible de récupérer le temps de réponse, qui doit normalement être dans ReplyBuffer sans passer par un pointeur ? Tous les autres code passe par

Code : Tout sélectionner

  *Result = AllocateMemory(ResultSize)
  *Echo.ICMP_ECHO_REPLY = *Result
Et je veut absolument éviter *Result = AllocateMemory(ResultSize)

Re: reponse a un ping sans pointeur

Publié : jeu. 15/nov./2012 16:15
par graph100

Code : Tout sélectionner

Procedure TestInetConnection()
  SendData$ = "Test"
  ReplyBuffer$ = Space(SizeOf(ICMP_ECHO_REPLY) + Len(SendData$) + SizeOf(character))
  hIcmpFile = IcmpCreateFile_()
  dwRetVal = IcmpSendEcho_(hIcmpFile, inet_addr_("192.168.0.1"), @SendData$, Len(SendData$), #Null, @ReplyBuffer$, Len(ReplyBuffer$) + SizeOf(ICMP_ECHO_REPLY), 1000)
  
  *Echo.ICMP_ECHO_REPLY = @ReplyBuffer$
  
  Debug *echo\RoundTripTime
  
  
  If dwRetVal
    ProcedureReturn 1
  Else
    ProcedureReturn 0
  EndIf
  
  
EndProcedure

Debug TestInetConnection()
C'est bien le retour que tu voulais en debug ?
Moi ca me donne environ la même valeur que le ping de windows

Re: reponse a un ping sans pointeur

Publié : jeu. 15/nov./2012 17:17
par GallyHC
Bonjour,

Voila une petite routine que j'ai modifier pour donné le temps en Ms.

Code : Tout sélectionner

; +======================================================+
; |                                                      |
; +------------------------------------------------------+
; | COPYRIGHT(C)2007-2012, ALL RIGHT RESERVED KOAKDESIGN |
; +--------------+---------------------------------------+
; | Program type | PUREBASIC 4.51                        |
; +--------------+---------------------------------------+
; | VER & REV    | 0.0.1                                 |
; +--------------+---------------------------------------+
; | Program name | main.pb                               |
; +======================================================+

; +======================================================+
; | Original Version: 0.0.1                              |
; +--------------+---------------------------------------+
; | Created by   | GallyHomeCorp                         |
; | Graphix by   |                                       |
; +--------------+---------------------------------------+
; | Comments:    |                                       |
; +--------------+                                       |
; |                                                      |
; |                                                      |
; |                                                      |
; +======================================================+

; +======================================================+
; | Système d'Exploitation                               |
; +--------------+---------------------------------------+
; | Window       | Oui                                   |
; | Linux        | Non                                   |
; | MacOS        | Non                                   |
; +======================================================+

; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************

; +--------------------------------------------------------------------------+
; |                                                                          |
; +--------------------------------------------------------------------------+

EnableExplicit

#PING_TIMEOUT = 100

; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************

; +--------------------------------------------------------------------------+
; |                                                                          |
; +--------------------------------------------------------------------------+

Procedure lngNewAddress(address.s)
;
  Define A1.l
  Define A2.l
  Define A3.l
  Define A4.l
  Define Pos.l
  Define sDummy.s
  Define ldummy.l
  
  sDummy = address
  Pos = FindString(sDummy, ".",1)
  If Pos>0
    A1     = Val(Left(sDummy,Pos-1))
    sDummy = Right(sDummy,Len(sDummy)-Pos)
    Pos    = FindString(sDummy, ".",1)
    If Pos>0
      A2     = Val(Left(sDummy,Pos-1))
      sDummy = Right(sDummy,Len(sDummy)-Pos)
      Pos    = FindString(sDummy, ".",1)
      If Pos>0
        A3      = Val(Left(sDummy,Pos-1))
        sDummy  = Right(sDummy,Len(sDummy)-Pos)
        A4      = Val(sDummy)
        ldummy.l = 0
        PokeB(@ldummy,  A1)
        PokeB(@ldummy+1,A2)
        PokeB(@ldummy+2,A3)
        PokeB(@ldummy+3,A4)
        ProcedureReturn ldummy 
      EndIf 
    EndIf 
  EndIf 
  
EndProcedure

; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************

; +--------------------------------------------------------------------------+
; |                                                                          |
; +--------------------------------------------------------------------------+

Procedure Ping(sAddress.s, munpass.l = 4)
; ROUTINE DE GESTION DES PING.
  Define i.l
  Define lngHPort.l 
  Define lngDAddress.l 
  Define strMessage.s
  Define TheIPAddress.s
  Define *buffer
  Define LostPackets    = 0
  Define SuccessTrip    = 0
  Define RecdPackets    = 0
  Define ECHO.ICMP_ECHO_REPLY 

  If Asc(Mid(sAddress,1,1)) < 48 Or Asc(Mid(sAddress,1,1)) > 57
    ProcedureReturn #False      
  EndIf
  TheIPAddress  = sAddress
  lngDAddress   = lngNewAddress(sAddress)
  lngHPort      = IcmpCreateFile_()
  *buffer       = AllocateMemory(SizeOf(ICMP_ECHO_REPLY))
  For i=0 To munpass
    If IcmpSendEcho_(lngHPort, lngDAddress, @strMessage, #Null, #Null, *buffer, SizeOf(ICMP_ECHO_REPLY), #PING_TIMEOUT) = 0
      LostPackets + 1
    Else
      CopyMemory(*buffer, @ECHO, SizeOf(ICMP_ECHO_REPLY))
      
      ;
      ; ICI
      ; 
      Debug Str(ECHO\RoundTripTime) + " Ms"
      ;
      ; ICI
      ;

      SuccessTrip + 1
    EndIf
    Delay(100)
  Next i
  FreeMemory(*buffer)
  If LostPackets < SuccessTrip
    ProcedureReturn #True
  Else
    ProcedureReturn #False
  EndIf

EndProcedure 

; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************

; +--------------------------------------------------------------------------+
; |                                                                          |
; +--------------------------------------------------------------------------+

If ping("192.168.0.45") = #True
  Debug "PASSE"  
Else
  Debug "PASSE PAS"
EndIf
Cordialement,
GallyHC

Re: reponse a un ping sans pointeur

Publié : jeu. 15/nov./2012 17:59
par graph100
pourquoi tu fais un copymemory ? c'est pas utile...

@supercdfr : je ne comprend pas trop pourquoi tu utilises space() pour allouer de la mémoire à la place de allocatememory(), ya surement une raison, mais comme ca retourne un string, ça doit être plus lent qu'utiliser un buffer.

Re: reponse a un ping sans pointeur

Publié : jeu. 15/nov./2012 18:22
par GallyHC
Bonjour,

graph100> c'est pas faux, voila une version simplifier :

Code : Tout sélectionner

; +======================================================+
; |                                                      |
; +------------------------------------------------------+
; | COPYRIGHT(C)2007-2012, ALL RIGHT RESERVED KOAKDESIGN |
; +--------------+---------------------------------------+
; | Program type | PUREBASIC 4.51                        |
; +--------------+---------------------------------------+
; | VER & REV    | 0.0.1                                 |
; +--------------+---------------------------------------+
; | Program name | main.pb                               |
; +======================================================+

; +======================================================+
; | Original Version: 0.0.1                              |
; +--------------+---------------------------------------+
; | Created by   | GallyHomeCorp                         |
; | Graphix by   |                                       |
; +--------------+---------------------------------------+
; | Comments:    |                                       |
; +--------------+                                       |
; |                                                      |
; |                                                      |
; |                                                      |
; +======================================================+

; +======================================================+
; | Système d'Exploitation                               |
; +--------------+---------------------------------------+
; | Window       | Oui                                   |
; | Linux        | Non                                   |
; | MacOS        | Non                                   |
; +======================================================+

; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************

; +--------------------------------------------------------------------------+
; |                                                                          |
; +--------------------------------------------------------------------------+

EnableExplicit

#PING_TIMEOUT = 100

; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************

; +--------------------------------------------------------------------------+
; |                                                                          |
; +--------------------------------------------------------------------------+

Procedure Ping(sAddress.s, munpass.l = 4)
; ROUTINE DE GESTION DES PING.
  Define i.l
  Define lngHPort.l 
  Define strMessage.s
  Define LostPackets    = 0
  Define SuccessTrip    = 0
  Define ECHO.ICMP_ECHO_REPLY 

  If Asc(Mid(sAddress, 1, 1)) < 48 Or Asc(Mid(sAddress, 1, 1)) > 57
    ProcedureReturn #False
  EndIf
  lngHPort = IcmpCreateFile_()
  For i=0 To munpass
    If IcmpSendEcho_(lngHPort, inet_addr_(sAddress), @strMessage, #Null, #Null, @ECHO, SizeOf(ICMP_ECHO_REPLY), #PING_TIMEOUT) = 0
      LostPackets + 1
    Else
      
      ;
      ; ICI
      ; 
      Debug Str(ECHO\RoundTripTime) + " Ms"
      ;
      ; ICI
      ;

      SuccessTrip + 1
    EndIf
    Delay(100)
  Next i
  If LostPackets < SuccessTrip
    ProcedureReturn #True
  Else
    ProcedureReturn #False
  EndIf

EndProcedure 

; ****************************************************************************
; ****************************************************************************
; ****************************************************************************
; ****************************************************************************

; +--------------------------------------------------------------------------+
; |                                                                          |
; +--------------------------------------------------------------------------+

If ping("192.168.0.45") = #True
  Debug "PASSE"  
Else
  Debug "PASSE PAS"
EndIf

Re: reponse a un ping sans pointeur

Publié : ven. 16/nov./2012 12:18
par supercdfr
J’espérais pas tant de réponse :D

j'ai trouver ça sur un forum anglais, ou il utilisait SPACE. Et cela m'arrange car qui dis allocatememory dis pointeur, ce que je veut éviter.


En tout cas, merci encore.

Re: reponse a un ping sans pointeur

Publié : sam. 17/nov./2012 2:53
par graph100
supercdfr a écrit :qui dis allocatememory dis pointeur, ce que je veut éviter.
non tu peux aussi utiliser les peekX() et pokeX() mais c'est trop chiant :D