Netzwerkverbindung abfragen funktioniert nicht.

Für allgemeine Fragen zur Programmierung mit PureBasic.
funkheld
Beiträge: 647
Registriert: 31.12.2009 11:58

Netzwerkverbindung abfragen funktioniert nicht.

Beitrag von funkheld »

Hallo, guten Tag.

Wie kann man bitte die Netzwerkverbindung abfragen ?
Im unteren Programm funktioniert es nicht.
Das Programm stürzt ab und wird bei Nichtverbindung nicht abgefangen.

Habe die neueste Purebasicversion.

-------------------------
If InitNetwork() = 0
MessageRequester("Error", "Kein Netzwerk !", 0)
End
EndIf
-------------------------

Danke.

Gruss

Code: Alles auswählen

Global buffer.l,TEST.l,itest.l
Global text_e.s, url.s, str_1.s
Global zahl.a
Global pi.f,winkel.f,x1.f,y1.f,wd.f

Enumeration
  #Window_0
  #Editor_0
  #vor
  #zur
  #links
  #rechts
  #mitte
  #cls
  #v0
  #v1
  #v2
  #hlinks
  #hrechts
  #servo0
  #servo1
  #sharp
  #ton
  #canv
EndEnumeration

If InitNetwork() = 0
  MessageRequester("Error", "Kein Netzwerk !", 0)
  End
EndIf
  
url= "http://192.168.2.101/?pin=vor" 

OpenWindow(#Window_0,500,200,900,550,"esp-webserver-http", #PB_Window_SystemMenu)
CanvasGadget(#canv, 380, 20, 400, 400)

AddWindowTimer(#Window_0, 123, 400)

EditorGadget(#Editor_0, 10, 200, 280,300)

ButtonGadget(#vor, 120,20, 40, 25, "vor")
ButtonGadget(#zur, 120,80, 40, 25, "zurück")
ButtonGadget(#mitte, 120,50, 40, 25, "mitte")
ButtonGadget(#hlinks, 75,50, 40, 25, "hlinks")
ButtonGadget(#links, 30,50, 40, 25, "links")
ButtonGadget(#rechts, 210,50, 40, 25, "rechts")
ButtonGadget(#hrechts, 165,50, 40, 25, "hrechts")
ButtonGadget(#cls, 310,200, 40, 25, "cls")
ButtonGadget(#v0, 310,20, 40, 25, "v0")
ButtonGadget(#v1, 310,50, 40, 25, "v1")
ButtonGadget(#v2, 310,80, 40, 25, "v2")
ButtonGadget(#servo0, 120,140, 40, 25, "servo0")
ButtonGadget(#servo1, 165,140, 40, 25, "servo1")
ButtonGadget(#sharp, 210,140, 40, 25, "sharp")
ButtonGadget(#ton, 255,140, 40, 25, "ton")

pi = ACos(0)*2

Repeat  
  Event = WaitWindowEvent()
  
  If Event = #PB_Event_Timer And EventTimer() = 123
    SetGadgetText(#Editor_0, text_e)
    Buffer = ReceiveHTTPMemory(url)
    If buffer  
      str_1=Str(PeekC(Buffer))
      zahl=Val(str_1)
      If zahl < 0
        zahl=128-zahl
      EndIf
      str_1=Str(zahl)
      text_e + str_1 +Chr(10)
      SetGadgetText(#Editor_0, text_e) 
      FreeMemory(Buffer)
      
      winkel=winkel+wd
      If winkel > 180
        TEST=0
      EndIf       
    EndIf
    URL = SetURLPart(URL, "pin", "leer")
  EndIf   
  
  If Event = #PB_Event_Gadget 
    StartDrawing(CanvasOutput(#canv))
      If TEST=1
        x1 = Sin(winkel/180*pi) * zahl
        y1 = Cos(winkel/180*pi) * zahl
        LineXY(200,200,200+x1,200+y1,RGB(255,0,0))
      EndIf 
      If TEST=2
        x1 = Sin((winkel+180)/180*pi) * zahl
        y1 = Cos((winkel+180)/180*pi) * zahl
        LineXY(200,200,200+x1,200+y1,RGB(0,255,0))
      EndIf
      If TEST=3
        Box(0,0,399,399,RGB(255,255,255))
      EndIf  
    StopDrawing() 
  EndIf
    
  Select Event
    Case #PB_Event_Gadget
      EventGadget = EventGadget()
      EventType = EventType()
      
      If EventGadget =  #vor
        URL = SetURLPart(URL, "pin", "vor")      
      EndIf
      
      If EventGadget =  #zur
        URL = SetURLPart(URL, "pin", "zur")     
      EndIf
      
      If EventGadget =  #links
        URL = SetURLPart(URL, "pin", "links")       
      EndIf
      
      If EventGadget =  #hlinks
        URL = SetURLPart(URL, "pin", "hlinks")      
      EndIf
      
      If EventGadget =  #rechts
        URL = SetURLPart(URL, "pin", "rechts")      
      EndIf
      
      If EventGadget =  #hrechts
        URL = SetURLPart(URL, "pin", "hrechts")        
      EndIf
      
      If EventGadget =  #mitte
        URL = SetURLPart(URL, "pin", "mitte")       
      EndIf
      
      If EventGadget =  #v0
        URL = SetURLPart(URL, "pin", "v0")       
      EndIf
      
      If EventGadget =  #v1
        URL = SetURLPart(URL, "pin", "v1")       
      EndIf
      
      If EventGadget =  #v2
        URL = SetURLPart(URL, "pin", "v2")       
      EndIf
      
      If EventGadget =  #servo0
        URL = SetURLPart(URL, "pin", "ser0")       
      EndIf
      
      If EventGadget =  #servo1
        URL = SetURLPart(URL, "pin", "ser1")  
        TEST=1
        winkel=0
        wd=2
      EndIf
      
      If EventGadget =  #sharp
        URL = SetURLPart(URL, "pin", "sharp") 
        TEST=2
        winkel=0
        wd=1.8
      EndIf
      
      If EventGadget =  #ton
        URL = SetURLPart(URL, "pin", "ton")      
      EndIf
      
      If EventGadget =  #cls
        text_e=""
        SetGadgetText(#Editor_0, text_e)
        TEST=3
      EndIf
      
    Case #PB_Event_CloseWindow
      EventWindow = EventWindow()
      If EventWindow = #Window_0
        CloseWindow(#Window_0)
        Break
      EndIf
  EndSelect 
ForEver
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Netzwerkverbindung abfragen funktioniert nicht.

Beitrag von STARGÅTE »

Ich probiere es einfach noch mal:
  • Code: Alles auswählen

    Buffer = ReceiveHTTPMemory(url)
    Diese Funktion gibt eine Speicheradresse (Pointer) zurück, das heißt, du musst/solltest hier *Buffer überall in deinem Code nutzen oder zumindest Buffer als .i (Integer) definieren und nicht .l (Long)
  • InitNetwork() prüft keine Netzwerkverbindung sondern initialisiert nur die Funktionen für Netzwerk und prüft ggf nur ob es überhaupt eine Netzwerkkarte gibt.
  • Code: Alles auswählen

    pi = ACos(0)*2
    Ausgefallene Definition, allerdings gibt es die Konstante #PI bereits
Wo stürzt denn dein Code ab, in welcher Zeile, an welchem Codesegment?
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
funkheld
Beiträge: 647
Registriert: 31.12.2009 11:58

Re: Netzwerkverbindung abfragen funktioniert nicht.

Beitrag von funkheld »

Es wird dann mal Zeit , das es ein Befehl gibt der auch eine Verbindung überwacht.

-----------------------
Wo stürzt denn dein Code ab, in welcher Zeile, an welchem Codesegment?
----------------------- :lol: :lol: :lol: :lol: :lol: :lol:

Gruss
Benutzeravatar
jear
Beiträge: 288
Registriert: 17.10.2004 01:59
Wohnort: Ammerland

Re: Netzwerkverbindung abfragen funktioniert nicht.

Beitrag von jear »

Willst Du Hilfe oder die Helfer anmachen?
Man ist nie zu alt zum lernen, auch wenn man dabei manchmal alt aussieht!
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
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

Re: Netzwerkverbindung abfragen funktioniert nicht.

Beitrag von NicTheQuick »

@funkheld: Die fällst hier zu häufig auf um dich so arrogant anzustellen. Wenn du Fragen nur aus Spaß fragst, dann kann ich deine Threads ja auch gleich in den Mülleimer verschieben.
lieferheld hat geschrieben:Es wird dann mal Zeit , das es ein Befehl gibt der auch eine Verbindung überwacht.
Und wie soll deiner Meinung nach solch ein Befehl aussehen? Entweder es gibt ein Timeout oder es kommt das entsprechende Event. Kritisieren kann jeder, gib lieber mal was konstruktives von dir.
funkheld
Beiträge: 647
Registriert: 31.12.2009 11:58

Re: Netzwerkverbindung abfragen funktioniert nicht.

Beitrag von funkheld »

Auf diesen Befehl kann man gänzlich verzichten:
InitNetwork()
Der so überflüssig wie ein Kropf, wenn man seine Tätigkeit sieht.

Gruss
Benutzeravatar
mhs
Beiträge: 224
Registriert: 11.01.2009 16:30
Wohnort: Graben
Kontaktdaten:

Re: Netzwerkverbindung abfragen funktioniert nicht.

Beitrag von mhs »

Naja, wenn du meinst...

Mit InitNetwork() wird z.B. unter Windows die WinSocket Schnittstelle eingebunden, ohne die keine der Netzwerkfunktionen möglich wäre. Außerdem scheitert die Intialisierung, wenn keine Netzwerkkarte verbaut ist, etc.

Natürlich könnte auch jede Netzwerkfunktion überprüfen, ob das Netzwerk initialisiert wurde und dies selbst erledigen, aber das ist eine konzeptionelle Sache, wo auch die aktuelle Implementierung seine Vorteile hat.
Michael Hack

Michael Hack Software :: Softwareentwicklung | Webentwicklung | IT-Dienstleistungen
www.michaelhacksoftware.de :: www.mh-s.de :: www.michael-hack.de
funkheld
Beiträge: 647
Registriert: 31.12.2009 11:58

Re: Netzwerkverbindung abfragen funktioniert nicht.

Beitrag von funkheld »

Na, wenn ich Netzwerk betreibe , brauche ich keine Überwachung ob die Netzwerkkarte eingebaut ist.
Wenn ich keine Netzwerkkarte habe , benutze ich auch nicht "InitNetwork()".

Wird der Benutzer hier für blöd gehalten?

Ich brauche eine Überwachung, ob die Verbindung hergestellt werden kann, wenn nein, soll das Programm sauber aussteigen.
"InitNetwork()". soll einbinden und überwachen.
Aus die Maus.

Gruss
Benutzeravatar
mhs
Beiträge: 224
Registriert: 11.01.2009 16:30
Wohnort: Graben
Kontaktdaten:

Re: Netzwerkverbindung abfragen funktioniert nicht.

Beitrag von mhs »

Du weisst also genau, dass jeder PC auf dem dein Programm installiert wird auch eine Netzwerkkarte hat, wenn du es 1000 mal verkaufst?

Und es geht ja primär auch nicht um die Abfrage der Netzwerkkarte, sondern um die Vorbereitung und Bereitstellung der Socketschnittstelle.

Um auf dein Problem zurückzukommen, ReceiveHTTPMemory hat ein Timeout, wenn eine URL nicht erreichbar ist, da es aber sehr lange ist, hängt dein Programm quasi. Das wird durch den Timer noch zusätzlich begünstigt, weil in der EventQueue in der Zeit des Timeouts neue Timer Events einlaufen (sieht man in meinem Beispiel mit den Debugausgaben) und dein Programm so von einem Timeout zum nächsten Timeout kommt. Das ist also einfach falsch programmiert. Eine Möglichkeit wäre, das ReceiveHTTPMemory in einen Thread auszulagern und mit einer Queue/Stack zu arbeiten oder alternativ den asynchronen Modus von ReceiveHTTPMemory zu nutzen. In beiden Fällen gibt es keine Verzögerung.

Zum Beispiel so:

Code: Alles auswählen

EnableExplicit

Global.i httpRequest
Global *Buffer

Global TEST.l,itest.l
Global text_e.s, url.s, str_1.s
Global zahl.a
Global pi.f,winkel.f,x1.f,y1.f,wd.f

Enumeration
  #Window_0
  #Editor_0
  #vor
  #zur
  #links
  #rechts
  #mitte
  #cls
  #v0
  #v1
  #v2
  #hlinks
  #hrechts
  #servo0
  #servo1
  #sharp
  #ton
  #canv
EndEnumeration

If InitNetwork() = 0
  MessageRequester("Error", "Kein Netzwerk !", 0)
  End
EndIf
 
url= "http://192.168.2.101/?pin=vor"

OpenWindow(#Window_0,500,200,900,550,"esp-webserver-http", #PB_Window_SystemMenu)
CanvasGadget(#canv, 380, 20, 400, 400)

AddWindowTimer(#Window_0, 123, 400)

EditorGadget(#Editor_0, 10, 200, 280,300)

ButtonGadget(#vor, 120,20, 40, 25, "vor")
ButtonGadget(#zur, 120,80, 40, 25, "zurück")
ButtonGadget(#mitte, 120,50, 40, 25, "mitte")
ButtonGadget(#hlinks, 75,50, 40, 25, "hlinks")
ButtonGadget(#links, 30,50, 40, 25, "links")
ButtonGadget(#rechts, 210,50, 40, 25, "rechts")
ButtonGadget(#hrechts, 165,50, 40, 25, "hrechts")
ButtonGadget(#cls, 310,200, 40, 25, "cls")
ButtonGadget(#v0, 310,20, 40, 25, "v0")
ButtonGadget(#v1, 310,50, 40, 25, "v1")
ButtonGadget(#v2, 310,80, 40, 25, "v2")
ButtonGadget(#servo0, 120,140, 40, 25, "servo0")
ButtonGadget(#servo1, 165,140, 40, 25, "servo1")
ButtonGadget(#sharp, 210,140, 40, 25, "sharp")
ButtonGadget(#ton, 255,140, 40, 25, "ton")

pi = ACos(0)*2

Define.i Event, EventGadget, EventType, EventWindow

Repeat 
  Event = WaitWindowEvent()
 
  If Event = #PB_Event_Timer And EventTimer() = 123
    SetGadgetText(#Editor_0, text_e)

    Debug "TimerEvent"
  
    If httpRequest
    
      Select HTTPProgress(httpRequest)
      
        Case #PB_Http_Success
          Debug "Success"
          *Buffer = FinishHTTP(httpRequest)
          httpRequest = 0
          
        Case #PB_Http_Failed
          Debug "Failed"
          httpRequest = 0

      EndSelect

    Else
      Debug "ReceiveHTTPMemory"
      httpRequest = ReceiveHTTPMemory(url, #PB_HTTP_Asynchronous)
      URL = SetURLPart(URL, "pin", "leer")
    EndIf

    If *Buffer 
      str_1=Str(PeekC(*Buffer))
      zahl=Val(str_1)
      If zahl < 0
        zahl=128-zahl
      EndIf
      str_1=Str(zahl)
      text_e + str_1 +Chr(10)
      SetGadgetText(#Editor_0, text_e)
      FreeMemory(*Buffer)
      *Buffer = #Null

      winkel=winkel+wd
      If winkel > 180
        TEST=0
      EndIf       
    EndIf
    
  EndIf   
 
  If Event = #PB_Event_Gadget
    StartDrawing(CanvasOutput(#canv))
      If TEST=1
        x1 = Sin(winkel/180*pi) * zahl
        y1 = Cos(winkel/180*pi) * zahl
        LineXY(200,200,200+x1,200+y1,RGB(255,0,0))
      EndIf
      If TEST=2
        x1 = Sin((winkel+180)/180*pi) * zahl
        y1 = Cos((winkel+180)/180*pi) * zahl
        LineXY(200,200,200+x1,200+y1,RGB(0,255,0))
      EndIf
      If TEST=3
        Box(0,0,399,399,RGB(255,255,255))
      EndIf 
    StopDrawing()
  EndIf
   
  Select Event
    Case #PB_Event_Gadget
      EventGadget = EventGadget()
      EventType = EventType()
     
      If EventGadget =  #vor
        URL = SetURLPart(URL, "pin", "vor")     
      EndIf
     
      If EventGadget =  #zur
        URL = SetURLPart(URL, "pin", "zur")     
      EndIf
     
      If EventGadget =  #links
        URL = SetURLPart(URL, "pin", "links")       
      EndIf
     
      If EventGadget =  #hlinks
        URL = SetURLPart(URL, "pin", "hlinks")     
      EndIf
     
      If EventGadget =  #rechts
        URL = SetURLPart(URL, "pin", "rechts")     
      EndIf
     
      If EventGadget =  #hrechts
        URL = SetURLPart(URL, "pin", "hrechts")       
      EndIf
     
      If EventGadget =  #mitte
        URL = SetURLPart(URL, "pin", "mitte")       
      EndIf
     
      If EventGadget =  #v0
        URL = SetURLPart(URL, "pin", "v0")       
      EndIf
     
      If EventGadget =  #v1
        URL = SetURLPart(URL, "pin", "v1")       
      EndIf
     
      If EventGadget =  #v2
        URL = SetURLPart(URL, "pin", "v2")       
      EndIf
     
      If EventGadget =  #servo0
        URL = SetURLPart(URL, "pin", "ser0")       
      EndIf
     
      If EventGadget =  #servo1
        URL = SetURLPart(URL, "pin", "ser1") 
        TEST=1
        winkel=0
        wd=2
      EndIf
     
      If EventGadget =  #sharp
        URL = SetURLPart(URL, "pin", "sharp")
        TEST=2
        winkel=0
        wd=1.8
      EndIf
     
      If EventGadget =  #ton
        URL = SetURLPart(URL, "pin", "ton")     
      EndIf
     
      If EventGadget =  #cls
        text_e=""
        SetGadgetText(#Editor_0, text_e)
        TEST=3
      EndIf
     
    Case #PB_Event_CloseWindow
      EventWindow = EventWindow()
      If EventWindow = #Window_0
        CloseWindow(#Window_0)
        Break
      EndIf
  EndSelect
ForEver
Zuletzt geändert von mhs am 05.04.2016 16:56, insgesamt 1-mal geändert.
Michael Hack

Michael Hack Software :: Softwareentwicklung | Webentwicklung | IT-Dienstleistungen
www.michaelhacksoftware.de :: www.mh-s.de :: www.michael-hack.de
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Netzwerkverbindung abfragen funktioniert nicht.

Beitrag von ts-soft »

funkheld hat geschrieben:Wird der Benutzer hier für blöd gehalten?
In diesem speziellen Falle, eindeutig JA! :mrgreen:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten