Seite 1 von 1

Ping - Programmabsturz

Verfasst: 17.11.2004 01:04
von pvmichael
Hallo!

im alten Forum habe ich folgenden Code gefunden:

Code: Alles auswählen

Procedure Ping(Add.s) ; If Result < 0 : Error : Else : Result = Time_in_ms ;)
  #PING_TIMEOUT = 2000
  Echo_Buffer = AllocateMemory(SizeOf(ICMP_ECHO_REPLY)+8)
  ECHO.ICMP_ECHO_REPLY
  lngHPort = IcmpCreateFile_()
  If lngHPort
    lngResult = IcmpSendEcho_(lngHPort, inet_addr_(Add), "Echo This.", 10, 0, Echo_Buffer, SizeOf(ICMP_ECHO_REPLY)+8, #PING_TIMEOUT)
    CopyMemory(Echo_Buffer,ECHO,SizeOf(ICMP_ECHO_REPLY))
    If lngResult = 0   
      PingResult = -1 ;Timeout
    Else
      If inet_addr_(Add) = ECHO\Address
        PingResult = ECHO\RoundTripTime
      Else
        If ECHO\Status = 0
          PingResult = ECHO\RoundTripTime
        Else
          PingResult = -2 ;IP nicht erreichbar
        EndIf
      EndIf
    EndIf
    lngResult = IcmpCloseHandle_(lngHPort)
  Else
    PingResult = -3 ;IcmpCreateFile_() = 0 ...
  EndIf
  FreeMemory(Echo_Buffer)
  ProcedureReturn PingResult
EndProcedure

IPe.s = ProgramParameter()
If IPe = ""
  IPe = Trim(InputRequester("Ping (Rings -> Deeem2031 -> Dristar -> NicTheQuick)", "IP oder Name zum pingen angeben:", ""))
EndIf

Global Wsad.WSAdata
WSAStartup_($101, Wsad)
*lpHost = gethostbyname_(IPe)
lpIp = PeekL(*lpHost + 12)
IPl.l = PeekL(lpIp)
IP.s = IPString(PeekL(IPl))

Ping.l = Ping(IP)

If Ping < 0
  MessageRequester("Ping", "Fehler bei der Eingabe oder kein Pingen möglich.", 0)
Else
  MessageRequester("Ping: " + IPe, "IP: " + IP + Chr(13) + "Pong: " + Str(Ping) + " ms", 0)
EndIf
Grundsätzlich funktioniert er gut, jedoch stürzt er auf einem Computer ab, wenn er keine Netzwerkkarte hat. Wie fängt man das am besten ab?

Grüsse

Michael

Verfasst: 17.11.2004 01:37
von Deeem2031
Nur 'ne Idee, hab keinen Comp ohne Netzwerkkarte ;)

Code: Alles auswählen

...

Global Wsad.WSAdata 
If WSAStartup_($101, Wsad) = 0
  *lpHost = gethostbyname_(IPe) 
  lpIp = PeekL(*lpHost + 12) 
  IPl.l = PeekL(lpIp) 
  ip.s = IPString(PeekL(IPl)) 
  
  Ping.l = Ping(ip) 
  
  If Ping < 0 
    MessageRequester("Ping", "Fehler bei der Eingabe oder kein Pingen möglich.", 0) 
  Else 
    MessageRequester("Ping: " + IPe, "IP: " + ip + Chr(13) + "Pong: " + Str(Ping) + " ms", 0) 
  EndIf
EndIf

Verfasst: 18.11.2004 15:16
von stbi
vielleicht das mal an den Anfang stellen:

Code: Alles auswählen

;
; ------------------------------------------------------------
;
;   PureBasic - Network (Server) example file
;
;    (c) 2003 - Fantaisie Software
;
; ------------------------------------------------------------
;

If InitNetwork() = 0
  MessageRequester("Error", "Can't initialize the network !", 0)
  End
EndIf


Verfasst: 18.11.2004 15:27
von NicTheQuick
Versuch mal meinen Code, der eigentlich aus allen möglichen zusammengesetzt worden ist. Man kann hier IPs, Computernamen und Webseiten angeben. Bei Computernamen und Websites wird beim Pong die IP des jeweiligen Computers oder der Webseite angezeigt.

Code: Alles auswählen

Procedure Ping(Add.s) ; If Result < 0 : Error : Else : Result = Time_in_ms ;) 
  #PING_TIMEOUT = 2000 
  Echo_Buffer = AllocateMemory(SizeOf(ICMP_ECHO_REPLY)+8) 
  ECHO.ICMP_ECHO_REPLY 
  lngHPort = IcmpCreateFile_() 
  If lngHPort 
    lngResult = IcmpSendEcho_(lngHPort, inet_addr_(Add), "Echo This.", 10, 0, Echo_Buffer, SizeOf(ICMP_ECHO_REPLY)+8, #PING_TIMEOUT) 
    CopyMemory(Echo_Buffer,ECHO,SizeOf(ICMP_ECHO_REPLY)) 
    If lngResult = 0    
      PingResult = -1 ;Timeout 
    Else 
      If inet_addr_(Add) = ECHO\Address 
        PingResult = ECHO\RoundTripTime 
      Else 
        If ECHO\Status = 0 
          PingResult = ECHO\RoundTripTime 
        Else 
          PingResult = -2 ;IP nicht erreichbar 
        EndIf 
      EndIf 
    EndIf 
    lngResult = IcmpCloseHandle_(lngHPort) 
  Else 
    PingResult = -3 ;IcmpCreateFile_() = 0 ... 
  EndIf 
  FreeMemory(Echo_Buffer) 
  ProcedureReturn PingResult 
EndProcedure

If InitNetwork() = 0
  MessageRequester("Ping", "Initialisierung des Netzwerks fehlgeschlagen.")
  End
EndIf

IPe.s = ProgramParameter()
If IPe = ""
  IPe = Trim(InputRequester("Ping (Rings -> Deeem2031 -> Dristar -> NicTheQuick)", "IP oder Name zum pingen angeben:", ""))
EndIf

Global Wsad.WSAdata
WSAStartup_($101, Wsad)
*lpHost = gethostbyname_(IPe)
lpIp = PeekL(*lpHost + 12)
IPl.l = PeekL(lpIp)
IP.s = IPString(PeekL(IPl))

Ping.l = Ping(IP)

If Ping < 0
  MessageRequester("Ping", "Fehler bei der Eingabe oder kein Pingen möglich.", 0)
Else
  MessageRequester("Ping: " + IPe, "IP: " + IP + Chr(13) + "Pong: " + Str(Ping) + " ms", 0)
EndIf