Ping - Programmabsturz

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
pvmichael
Beiträge: 144
Registriert: 29.08.2004 17:59
Wohnort: Rosenheim
Kontaktdaten:

Ping - Programmabsturz

Beitrag 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
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag 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
Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
stbi
Beiträge: 685
Registriert: 31.08.2004 15:39
Wohnort: Cleverly Hills

Beitrag 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

PB 4.02 XP Pro SP2 "Der Code ist willig, aber der Prozessor ist schwach."

Es gibt keine Vista-Witze. Es ist alles wahr!
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8820
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag 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
Antworten