TestClient - ReceiveNetworkData()

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
uweb
Beiträge: 461
Registriert: 13.07.2005 08:39

Beitrag von uweb »

Zunächst noch einmal Danke für Dein Engament und Deine Idee.
Die Umsetzung würde mich aber doch stark einschränken.

Oder ?

Woher weiß denn mein Browser z.B. wo eine Seite endet ?
Ist das tatsächlich ein 0-terminierter String ?

Für mich schien das aus der Hilfe eindeutig :
Ergebnis = ReceiveNetworkData(ConnectionID, *DatenBuffer, Länge)
...
'Ergebnis' gibt die Anzahl an bereits gelesenen Bytes an. Ist 'Ergebnis' gleich 'Länge', dann sind noch mehr Daten einzulesen.
Daran, das der Server seine Antwort selbst auch wieder in Pakete packt kann es auch nicht liegen. Denn, dann müsste ich ja zumindest immer ein ganzes Paket bekommen. Die empfangene Größe hängt aber offensichtlich bis zu einem bestimmten Maß von meiner Puffergröße ab. Danach macht es keinen Unterschied mehr.

Mein Kopf sagt : Da stimmt etwas nicht.
Mein Bauch sagt : Das ist eine Timing / Bandbreiten - Geschichte.
(Ich will meinen Akustikkoppler wieder haben!)
Benutzeravatar
Batze
Beiträge: 1492
Registriert: 03.06.2005 21:58
Wohnort: Berlin
Kontaktdaten:

Beitrag von Batze »

Jetzt seh ich das erst richtig. :shock:
Tut mir leid uweb, aber du hast glaub ich einen falschen Ansatz.

Du verbindest ja nur ganz kurz mit dem Server um die Datei zu kriegen.
Bis die kommt, kann aber dauern, wenn du nicht grade auf den eigenen PC zugreifst.

Am besten du baust in deine Eventschleife auch noch die Serverevents ein, oder benutzt Threads (ab PB 4).
Daran, das der Server seine Antwort selbst auch wieder in Pakete packt kann es auch nicht liegen. Denn, dann müsste ich ja zumindest immer ein ganzes Paket bekommen.
Mit deinem Code kriegst du leider gar keine Pakete.
Hier sind meine Codes (aber die Seite geht gerade nicht):
http://www.basicpure.de.vu
Benutzeravatar
uweb
Beiträge: 461
Registriert: 13.07.2005 08:39

Beitrag von uweb »

Ja, das war wohl ein Denk- und ein Flüchtigkeitsfehler.

Der Flüchtigkeitsfehler : Ich habe

Code: Alles auswählen

Laenge = #Puffergroesse
vor der Schleife vergessen.

Der Denkfehler : Das hätte auch nichts gebracht.

Ich mache mich nun ans Werk und melde mich wieder.
Benutzeravatar
uweb
Beiträge: 461
Registriert: 13.07.2005 08:39

Beitrag von uweb »

Ich habe es jetzt umgestrickt.
Als Abbruchbedingung habe ich eine Obergrenze für den String (nach dem Zuwachs) bzw eine Maximale Anzahl von Packeten angegeben.
Sicher gibt es da noch einiges zu verbessern. Vor allem ist es langsamer als die Ausgangsversion und da habe ich schon mit dem Delay balanciert.

Jetzt habe ich ein altes Problem in neuer Form wieder :
Das SetClipboardText() tut nun gar nichts mehr.

Vielleicht erbarmt sich noch einmal jemand. Dann könnte ich mich mit "Hauptsache es läuft" trösten.
Ich bin aber auch für Vorschläge die nichts mit dem Problem zu tun haben offen.
Da steckt, wie gesagt, noch viel Arbeit drin.

Code: Alles auswählen

OpenWindow(0, 0, 0, 300, 400, #PB_Window_SystemMenu|#PB_Window_ScreenCentered, "TestClient")

If CreateMenu(0, WindowID())
  MenuTitle("Info")
    MenuItem(1, "About")
EndIf

CreateGadgetList(WindowID())
IPAddressGadget(0, 5, 5, 145, 20)
StringGadget(1, 215, 5, 20, 20, "80")
ButtonGadget(2, 25, 30, 100, 20, "Verbinden")
ButtonGadget(3, 175, 30, 100, 20, "Senden")
EditorGadget(4, 5, 55, 290, 290, "")

TextGadget(5, 5, 350, 290, 45, "Bitte IP oder Port ggf. ändern und "+Chr(34)+"Verbinden"+Chr(34)+" drücken.",#PB_Text_Border )

EditorGadget(6, 5, 55, 290, 290, "")
ButtonGadget(7, 175, 30, 100, 20, "Kopieren")

HideGadget(6, 1)
HideGadget(7, 1)

SetGadgetState(0,MakeIPAddress(127,0,0,1))
SetGadgetText(4,"GET /isapi.htm HTTP/1.1"+Chr(13)+Chr(10)+"Request Method: GET"+Chr(13)+Chr(10)+"Request URI: /isapi.htm"+Chr(13)+Chr(10)+"Request Version: HTTP/1.1"+Chr(13)+Chr(10)+"Host: 192.168.2.2"+Chr(13)+Chr(10)+"User-Agent: Mozilla/5.0 (Windows; U; Win98; de-DE; rv:1.5a) Gecko/20030728 Mozilla Firebird/0.6.1"+Chr(13)+Chr(10)+"Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1"+Chr(13)+Chr(10)+"Accept-Language: de-DE,de;q=0.8,en-us;q=0.5,en;q=0.3"+Chr(13)+Chr(10)+"Accept-Encoding: gzip,deflate"+Chr(13)+Chr(10)+"Accept-Charset: ISO-8859-15,utf-8;q=0.7,*;q=0.7"+Chr(13)+Chr(10)+"Keep-Alive: 300"+Chr(13)+Chr(10)+"Connection: keep-alive"+Chr(13)+Chr(10)+Chr(13)+Chr(10))
DisableGadget(3, 1)
DisableGadget(4, 1)
   
;#Puffergroesse = 10485576
;#Puffergroesse = 16384
;#Puffergroesse = 32768
#Puffergroesse = 1024

*Puffer=AllocateMemory(#Puffergroesse)

;For i = 0 To Laenge - 1
;  PokeB(*Puffer + i, 42)
;Next

ConnectionID=0

If InitNetwork()=0
  MessageRequester("Fehler", "Kein Netzwerk gefunden.", 0)
EndIf

AddKeyboardShortcut(0, #PB_Shortcut_F1, 1)

DetachMenu() 

Repeat

;  Delay(10)
  
  Gosub Client

  EventID=WaitWindowEvent()
  
  If EventID=#PB_Event_Menu
    If EventMenuID()=1
      MessageRequester("Info","TestClient von Uwe Beisler",0)
    EndIf
  EndIf
 
  If EventID=#PB_Event_Gadget
    If EventGadgetID()=2  ;Verbinden
      DisableGadget(3, 1)
      DisableGadget(4, 1)
      SetGadgetText(5,"Versuche Server zu erreichen.")
      Host$=GetGadgetText(0)
      Port$=GetGadgetText(1)
      ConnectionID.l = OpenNetworkConnection(Host$,Val(Port$))
      If ConnectionID = 0
        SetGadgetText(5,"Server ist nicht erreichbar."+Chr(13)+Chr(10)+"Bitte IP oder Port neu eingeben und "+Chr(34)+"Verbinden"+Chr(34)+" drücken.")
      Else
        SetGadgetText(5,"Server ist erreichbar."+Chr(13)+Chr(10)+"Bitte Anfrage ggf. ändern und "+Chr(34)+"Senden"+Chr(34)+" drücken.")
          HideGadget(6, 1)
          HideGadget(7, 1)
        DisableGadget(3, 0)
        DisableGadget(4, 0)
      EndIf
    EndIf

    If EventGadgetID()=3  ;Senden
      SetGadgetText(0,Host$)
      SetGadgetText(1,Port$)
      Anfrage$ = GetGadgetText(4)
      SendNetworkData(ConnectionID, @Anfrage$, Len(Anfrage$))
      Durchlauf = 0
    EndIf

    If EventGadgetID()=7
      Inhalt$=GetGadgetText(6)
      SetClipboardText(Inhalt$)
      MessageRequester("Info","Kopieren wurde gedrückt.",0)
    EndIf

  EndIf

  If EventID = #PB_EventCloseWindow
    Exit=1
    FreeMemory(Puffer)
  EndIf
 
Until Exit=1
End

Client:
  If ConnectionID
    NCE = NetworkClientEvent(ConnectionID)
    If NCE
      Packet$=""
      Laenge = 0
      If Durchlauf = 0
        HideGadget(6, 0)
        HideGadget(7, 0)
        DisableGadget(3, 1)
        DisableGadget(4, 1)
        SetGadgetText(5,"Antwort erhalten."+Chr(13)+Chr(10)+"Bitte Antwort ggf. ändern und "+Chr(34)+"Kopieren"+Chr(34)+" drücken, oder IP bzw. Port ggf. ändern und "+Chr(34)+"Verbinden"+Chr(34)+" drücken.")
      EndIf
      If Durchlauf = 32768 ;wenn keiner mehr mit mir spricht, dann gehe ich
        CloseNetworkConnection(ConnectionID)
        Antwort$=""
        ConnectionID=0
        Debug "Empfangsschleife abgebrochen."
      Else
        Durchlauf=Durchlauf+1      
        If NCE=2
          Laenge = ReceiveNetworkData(ConnectionID,*Puffer,#Puffergroesse)
          If Laenge > 0
            teile = 1
            Packet$=PeekS(*Puffer,Laenge)
            While Laenge=#Puffergroesse
              Laenge = ReceiveNetworkData(ConnectionID,*Puffer,#Puffergroesse)
              Packet$=Packet$+PeekS(*Puffer,Laenge)
              teile = teile + 1
            Wend
            Antwort$ = Antwort$ + Packet$
            Debug "teile = "+ Str(teile)+"  Größe des letzten Packets = "+Str(Len(Packet$))
            Debug "Durchlauf = "+ Str(Durchlauf)+"  Größe von Antwort = "+Str(Len(Antwort$))
            If Len(Antwort$) > 32768
              Durchlauf = 32768
            EndIf
            SetGadgetText(6,Antwort$)

          EndIf
;          If PeekB(@Puffer + Len(Antwort$) + 1 ) = 0
;            MessageRequester("Info","Puffer enthält den Bytwert 0",0)
;          EndIf
        ElseIf NCE=3
          ReceiveNetworkFile(ConnectionID,Antwort$)
        EndIf
      EndIf
    EndIf
  EndIf  
Return
edit :
Ich habe es gerade bei google probiert. Mit der Version bekomme ich eine Antwort.
Da steht zwar im Kopf noch etwas Müll aber immerhin hat sich die Mühe gelohnt. Danke nocheinmal an Batze und emptee.
Lokal klappt es ohne Müll. Das Kopieren Problem kommt nur vor wenn ich es mit der Datenmenge übertreibe (67 KB sind machbar).
Allerdings ist es mitunter so langsam, daß die Gadgets nicht sauber aufgebaut bzw verändert werden.
Zuletzt geändert von uweb am 07.02.2006 22:15, insgesamt 1-mal geändert.
Benutzeravatar
Batze
Beiträge: 1492
Registriert: 03.06.2005 21:58
Wohnort: Berlin
Kontaktdaten:

Beitrag von Batze »

Bei mir ging das kopieren eigentlich immer.
Eigentlich kann da kein Fehler mehr liegen.
Leider steig ich nicht ganz durch deinen Code durch, aber richtig sieht es irgendwie noch nicht aus. So ohne Endzeichen für das Protokoll. :freak:
Hier sind meine Codes (aber die Seite geht gerade nicht):
http://www.basicpure.de.vu
Benutzeravatar
uweb
Beiträge: 461
Registriert: 13.07.2005 08:39

Beitrag von uweb »

Ja, das Ende der Übertragung ist sicher noch eine der Baustellen daran.
Ich bin mir nicht sicher, aber ich glaube bei HTTP gibt es kein EOF oder ähnliches.

Mit der neuen Version kann ich die Grenze so weit hoch setzen, daß keine Probleme mehr zu erwarten sind.

Vorher muß ich aber noch das Müll- und das Geschwindigkeitsproblem lössen.

edit :
Leider steig ich nicht ganz durch deinen Code durch, ...
In der Politik bezeichnet man so etwas glaube ich als gewachsene Struktur und warnt eindringlich davor daran zu rütteln.
Aber, auch dort läßt man sich zu kosmetischen Änderungen bewegen und verkauft die dann als Innovation.

Code: Alles auswählen

Anfrage$ = "GET /isapi.htm HTTP/1.1"+Chr(13)+Chr(10)+"Request Method: GET"+Chr(13)+Chr(10)
Anfrage$ = Anfrage$ + "Request URI: /isapi.htm"+Chr(13)+Chr(10)+"Request Version: HTTP/1.1"
Anfrage$ = Anfrage$ + Chr(13)+Chr(10)+"Host: 192.168.2.2"+Chr(13)+Chr(10)
Anfrage$ = Anfrage$ + "User-Agent: Mozilla/5.0 (Windows; U; Win98; de-DE; rv:1.5a) Gecko/20030728 Mozilla Firebird/0.6.1"
Anfrage$ = Anfrage$ + Chr(13)+Chr(10)+"Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif;q=0.2,*/*;q=0.1"
Anfrage$ = Anfrage$ + Chr(13)+Chr(10)+"Accept-Language: de-DE,de;q=0.8,en-us;q=0.5,en;q=0.3"
Anfrage$ = Anfrage$ + Chr(13)+Chr(10)+"Accept-Encoding: gzip,deflate"+Chr(13)+Chr(10)
Anfrage$ = Anfrage$ + "Accept-Charset: ISO-8859-15,utf-8;q=0.7,*;q=0.7"+Chr(13)+Chr(10)
Anfrage$ = Anfrage$ + "Keep-Alive: 300"+Chr(13)+Chr(10)+"Connection: keep-alive"+Chr(13)+Chr(10)+Chr(13)+Chr(10)

Text1$="Bitte IP oder Port ggf. ändern und "+Chr(34)+"Verbinden"+Chr(34)+" drücken."

Text2$="Server ist nicht erreichbar."+Chr(13)+Chr(10)+"Bitte IP oder Port neu eingeben und "
Text2$=Text2$+Chr(34)+"Verbinden"+Chr(34)+" drücken."

Text3$="Server ist erreichbar."+Chr(13)+Chr(10)+"Bitte Anfrage ggf. ändern und "+Chr(34)+"Senden"+Chr(34)+" drücken."

Text4$="Antwort erhalten."+Chr(13)+Chr(10)+"Bitte Antwort ggf. ändern und "+Chr(34)+"Kopieren"
Text4$=Text4$+Chr(34)+" drücken, oder IP bzw. Port ggf. ändern und "+Chr(34)+"Verbinden"+Chr(34)+" drücken."


OpenWindow(0, 0, 0, 300, 400, #PB_Window_SystemMenu|#PB_Window_ScreenCentered, "TestClient")

If CreateMenu(0, WindowID())
  MenuTitle("Info")
    MenuItem(1, "About")
EndIf

CreateGadgetList(WindowID())
IPAddressGadget(0, 5, 5, 145, 20)
StringGadget(1, 215, 5, 20, 20, "80")
ButtonGadget(2, 25, 30, 100, 20, "Verbinden")
ButtonGadget(3, 175, 30, 100, 20, "Senden")
EditorGadget(4, 5, 55, 290, 290, "")

TextGadget(5, 5, 350, 290, 45, Text1$ ,#PB_Text_Border ) ; Status: Bitte Verbinden

EditorGadget(6, 5, 55, 290, 290, "")
ButtonGadget(7, 175, 30, 100, 20, "Kopieren")

HideGadget(6, 1)
HideGadget(7, 1)

SetGadgetState(0,MakeIPAddress(127,0,0,1))
SetGadgetText(4,Anfrage$)
DisableGadget(3, 1)
DisableGadget(4, 1)
   
#Puffergroesse = 1426 ;beliebige Größe

*Puffer=AllocateMemory(#Puffergroesse)

ConnectionID=0

If InitNetwork()=0
  MessageRequester("Fehler", "Kein Netzwerk gefunden.", 0)
EndIf

AddKeyboardShortcut(0, #PB_Shortcut_F1, 1)
DetachMenu() 

Repeat

  Gosub Client

  EventID=WaitWindowEvent()
  
  If EventID=#PB_Event_Menu
    If EventMenuID()=1
      MessageRequester("Info","TestClient von Uwe Beisler",0)
    EndIf
  EndIf
 
  If EventID=#PB_Event_Gadget
    If EventGadgetID()=2  ;Verbinden
      DisableGadget(3, 1) ;Senden
      DisableGadget(4, 1) ;EditorGadget für die Anfrage
      SetGadgetText(5,"Versuche Server zu erreichen.")
      Host$=GetGadgetText(0)
      Port$=GetGadgetText(1)
      ConnectionID.l = OpenNetworkConnection(Host$,Val(Port$))
      If ConnectionID = 0
        SetGadgetText(5,Text2$) ; Status : Server ist nicht erreichbar.
      Else
        SetGadgetText(5,Text3$) ; Status : Server ist erreichbar.
          HideGadget(6, 1) ;EditorGadget für die Antwort
          HideGadget(7, 1) ;Kopieren
        DisableGadget(3, 0);Senden
        DisableGadget(4, 0);EditorGadget für die Anfrage
      EndIf
    EndIf

    If EventGadgetID()=3  ;Senden
      SetGadgetText(0,Host$)
      SetGadgetText(1,Port$)
      Anfrage$ = GetGadgetText(4);Anfrage könnte editiert worden sein
      SendNetworkData(ConnectionID, @Anfrage$, Len(Anfrage$))
      Durchlauf = 0
    EndIf

    If EventGadgetID()=7  ;Kopieren
      Inhalt$=GetGadgetText(6)
      SetClipboardText(Inhalt$)
      MessageRequester("Info","Kopieren wurde gedrückt.",0)
    EndIf

  EndIf

  If EventID = #PB_EventCloseWindow
    Exit=1
    FreeMemory(Puffer)
  EndIf
 
Until Exit=1
End

Client:
  If ConnectionID
    NCE = NetworkClientEvent(ConnectionID)
    If NCE
      Packet$=""
      Laenge = 0
      If Durchlauf = 0
        HideGadget(6, 0)    ;EditorGadget für die Antwort
        HideGadget(7, 0)    ;Kopieren
        DisableGadget(3, 1) ;Senden
        DisableGadget(4, 1) ;EditorGadget für die Anfrage
        SetGadgetText(5,Text4$)
      EndIf
      If Durchlauf = 32768 ;maximale Anzahl zu empfangender Pakete
        CloseNetworkConnection(ConnectionID)
        Antwort$=""
        ConnectionID=0
      Else
        Durchlauf=Durchlauf+1      
        If NCE=2
          Laenge = ReceiveNetworkData(ConnectionID,*Puffer,#Puffergroesse)
          If Laenge > 0
            Packet$=PeekS(*Puffer,Laenge)
            While Laenge=#Puffergroesse
              Laenge = ReceiveNetworkData(ConnectionID,*Puffer,#Puffergroesse)
              Packet$=Packet$+PeekS(*Puffer,Laenge)
            Wend
            Antwort$ = Antwort$ + Packet$
            If Len(Antwort$) > 32768
              Durchlauf = 32768 ; indirekter Abbruch per Obergrenze von Durchlauf
            EndIf
            SetGadgetText(6,Antwort$)
          EndIf
        ElseIf NCE=3
          ReceiveNetworkFile(ConnectionID,Antwort$)
        EndIf
      EndIf
    EndIf
  EndIf  
Return
Benutzeravatar
uweb
Beiträge: 461
Registriert: 13.07.2005 08:39

Beitrag von uweb »

So, jetzt habe ich einen Meilenstein erreicht: Man kann damit arbeiten.
Der "Müll" resultiete übrigens aus "Accept-Encoding: gzip,...".

TestClient ist es wie gesagt ein sehr einfaches Testwerkzeug für Protokolle oberhalb von TCP/IP.
Man kann damit Anfragen formulieren und Antworten erhalten.

Es soll also irgendwann z.B. FTP, SMTP, HTTP und WebDAV direkt unterstützen.
Im Moment läuft das nur per Hand.

Mir ging es auf die Nerven dauernd zwischen verschiedenen Clients und Ethereal zu wechseln
und mich dort jeweils durch die Menüs zu kämpfen.

Es spielt übrigens keine Rolle, ob man auf der Client- oder auf der Serverseite entwickelt oder
sich einfach nur in ein Protokoll einarbeiten möchte.

Im Moment sind im Quelltext zwei HTTP Anfragen hinterlegt.
Man kann durch Lokal = 0 oder Lokal = 1 einfach umschalten.
Später wird man u.a. fertige Anfragen speichern und laden können.

>>> Es nett wenn ich Feedback bekäme, ob das überhaupt jemanden interesiert.

Einer der noch offenen Punkte ist der Abschluß der Übertragung. Im Moment begrenze ich die Größe der Antwort
und die Anzahl der erfolglosen Empfangsverbindungen (je nach dem was als erstes erfolgt).
Das bedeuted aber auch, daß ich es erst spät merke wenn eine Antwort schon zu Ende ist.

>>> Kann mir jemand sagen wie das Ende bei HTTP definiert ist.

>>> Habt ihr Beispiele für Anfragen mit anderen Protokollen und wisst etwas über deren Ende-Bedingung ?

(Bitte keine RFC's o.ä.)

Und noch eine Bitte habe ich :

Wenn ich nach erhaltener Antwort "Verbinden" drücke sollte eigentlich
der deaktivierte Senden-Button und das deaktivierte EditorGadget für die Anfrage sofort sichtbar sein.
Bei z.B. ungültigem Port geht es etwas länger und man sieht, daß es nicht so ist.
Wer es nicht weiß denkt wohl es gehört so. Trotzdem würde ich es gerne lösen.

>>> Wo liegt der Fehler ?

Code: Alles auswählen

Lokal = 0

LAnfrage$ = "GET /isapi.htm HTTP/1.1\r\nRequest Method: GET\r\nRequest "
LAnfrage$ = LAnfrage$ + "URI: /isapi.htm\r\nRequest Version: HTTP/1.1\r\nHost: 192.168.2.2\r\n"
LAnfrage$ = LAnfrage$ + "User-Agent: Mozilla/5.0 (Windows; U; Win98; de-DE; rv:1.5a)"
LAnfrage$ = LAnfrage$ + " Gecko/20030728 Mozilla Firebird/0.6.1\r\n"
LAnfrage$ = LAnfrage$ + "Accept: text/xml,application/xml,application/xhtml+xml,text/html"
LAnfrage$ = LAnfrage$ + ";q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif"
LAnfrage$ = LAnfrage$ + ";q=0.2,*/*;q=0.1\r\nAccept-Language: de-DE,de;q=0.8,en-us;q=0.5,en"
LAnfrage$ = LAnfrage$ + ";q=0.3\r\nAccept-Encoding: gzip,deflate\r\nAccept-Charset:"
LAnfrage$ = LAnfrage$ + " ISO-8859-15,utf-8;q=0.7,*;q=0.7\r\nKeep-Alive: 300\r\n"
LAnfrage$ = LAnfrage$ + "Connection: keep-alive\r\n\r\n"
LAnfrage$ = ReplaceString(LAnfrage$, "\r\n", Chr(13)+Chr(10)) 

RAnfrage$ = "GET /search?hl=de&q=%22PureBasic+4.0%22&btnG=Google-Suche&meta= HTTP/1.1\r\n"
RAnfrage$ = RAnfrage$ + "Host: www.google.de\r\n"
RAnfrage$ = RAnfrage$ + "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; de; rv:1.8.0.1)"
RAnfrage$ = RAnfrage$ + " Gecko/20060111 Firefox/1.5.0.1\r\n"
RAnfrage$ = RAnfrage$ + "Accept: text/xml,application/xml,application/xhtml+xml"
RAnfrage$ = RAnfrage$ + ",text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n"
RAnfrage$ = RAnfrage$ + "Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3\r\n"
RAnfrage$ = RAnfrage$ + "Accept-Encoding: deflate\r\n"
RAnfrage$ = RAnfrage$ + "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n"
RAnfrage$ = RAnfrage$ + "Keep-Alive: 300\r\n"
RAnfrage$ = RAnfrage$ + "Connection: keep-alive\r\n"
RAnfrage$ = RAnfrage$ + "Referer: http://www.google.de/\r\n"
RAnfrage$ = RAnfrage$ + "Cookie: PREF=ID=f5a427e63799b096:TM=1136453808:LM=1136453808"
RAnfrage$ = RAnfrage$ + ":S=EcP1dNcr76ya93hs\r\n\r\n"
RAnfrage$ = ReplaceString(RAnfrage$, "\r\n", Chr(13)+Chr(10)) 

Text1$=Chr(13)+Chr(10)+"Bitte IP oder Port ggf. ändern und *Verbinden* drücken."
ReplaceString(Text1$, "*", Chr(34), 2)

Text2$=Chr(13)+Chr(10)+"Bitte IP oder Port ändern und *Verbinden* drücken."
ReplaceString(Text2$, "*", Chr(34), 2)

Text3$=Chr(13)+Chr(10)+"Bitte Anfrage ggf. ändern und *Senden* drücken,"
ReplaceString(Text3$, "*", Chr(34), 2)

Text4$=Chr(13)+Chr(10)+"Bitte warten."
ReplaceString(Text4$, "*", Chr(34), 2)

Text5$=Chr(13)+Chr(10)+"Bitte Antwort ggf. ändern und *Kopieren* drücken,"
ReplaceString(Text5$, "*", Chr(34), 2)

Text6$=Chr(13)+Chr(10)+" oder IP bzw. Port ggf. ändern und *Verbinden* drücken."
ReplaceString(Text6$, "*", Chr(34), 2)

Status1$=""+Text1$
Status2$="Server ist nicht erreichbar."+Text2$
Status3$="Server ist erreichbar."+Text3$+Text6$
Status4$="Anfrage wird bearbeitet."+Text4$
Status5$="Antwort ist noch nicht komplett."+Text4$
Status6$="Antwort erhalten."+Text5$+Text6$
Status7$="Antwort wurde in die Zwischenablage kopiert."+Text5$+Text6$

OpenWindow(0, 0, 0, 300, 400, #PB_Window_SystemMenu|#PB_Window_ScreenCentered, "TestClient")

If CreateMenu(0, WindowID())
  MenuTitle("Info")
    MenuItem(1, "About")
EndIf

CreateGadgetList(WindowID())
IPAddressGadget(0, 5, 5, 145, 20)
StringGadget(1, 205, 5, 40, 20, "80")
ButtonGadget(2, 25, 30, 100, 20, "Verbinden")
ButtonGadget(3, 175, 30, 100, 20, "Senden")
EditorGadget(4, 5, 55, 290, 290, "")

TextGadget(5, 5, 350, 290, 45, Status1$ ,#PB_Text_Border ) ; Status: Bitte Verbinden

EditorGadget(6, 5, 55, 290, 290, "")
ButtonGadget(7, 175, 30, 100, 20, "Kopieren")

HideGadget(6, 1)
HideGadget(7, 1)

If Lokal
  SetGadgetState(0,MakeIPAddress(127,0,0,1))
  Anfrage$ = LAnfrage$
Else
  SetGadgetState(0,MakeIPAddress(064,233,183,103))
  Anfrage$ = RAnfrage$
EndIf

SetGadgetText(4,Anfrage$)
DisableGadget(3, 1)
DisableGadget(4, 1)
   
#Puffergroesse = 1426 ;beliebige Größe

*Puffer=AllocateMemory(#Puffergroesse)

ConnectionID=0
Durchlauf=0

#MaxAnzahlErfolgloserVersuche=128
#MaxGroesseDerAntwort=63999

If InitNetwork()=0
  MessageRequester("Fehler", "Kein Netzwerk gefunden.", 0)
EndIf

AddKeyboardShortcut(0, #PB_Shortcut_F1, 1)
DetachMenu() 

Repeat

  Gosub Client

  If Durchlauf
    Delay(1)
    EventID=WindowEvent()
  Else
    EventID=WaitWindowEvent()
  EndIf
  
  If EventID=#PB_Event_Menu
    If EventMenuID()=1
      MessageRequester("Info","TestClient von Uwe Beisler",0)
    EndIf
  EndIf
 
  If EventID=#PB_Event_Gadget

    If EventGadgetID()=2  ;>>>>  Verbinden  
      HideGadget(6, 1)          ;EditorGadget für die Antwort verstecken
      HideGadget(7, 1)          ;Kopieren-Button verstecken
      HideGadget(3, 0)          ;Senden-Button anzeigen
      HideGadget(4, 0)          ;EditorGadget für die Anfrage anzeigen
      DisableGadget(3, 1)       ;Senden-Button deaktivieren
      DisableGadget(4, 1)       ;EditorGadget für die Anfrage deaktivieren

      SetGadgetText(5,"Versuche Server zu erreichen.")
      Host$=GetGadgetText(0)
      Port$=GetGadgetText(1)
      ConnectionID.l = OpenNetworkConnection(Host$,Val(Port$))
      If ConnectionID = 0
        SetGadgetText(5,Status2$)     ;Status : Server ist nicht erreichbar.
      Else
        SetGadgetText(5,Status3$)     ;Status : Server ist erreichbar.
        DisableGadget(3, 0)     ;Senden-Button aktivieren
        DisableGadget(4, 0)     ;EditorGadget für die Anfrage aktivieren
      EndIf
    EndIf

    If EventGadgetID()=3  ;>>>>  Senden
      DisableGadget(3, 1)       ;Senden-Button deaktivieren
      DisableGadget(4, 1)       ;EditorGadget für die Anfrage deaktivieren
      SetGadgetText(0,Host$)
      SetGadgetText(1,Port$)
      SetGadgetText(5,Status4$)       ;Status : Anfrage wird bearbeitet
      Anfrage$=GetGadgetText(4) ;(Anfrage könnte editiert worden sein)
      SetGadgetText(6,"")       ;alte Antwort löschen 
      HideGadget(3, 1)          ;Senden-Button verstecken
      HideGadget(4, 1)          ;EditorGadget für die Anfrage verstecken
      HideGadget(6, 0)          ;EditorGadget für die Antwort anzeigen
      HideGadget(7, 0)          ;Kopieren-Button anzeigen
      DisableGadget(7, 1)       ;Kopieren-Button deaktivieren bis Antwort komplett
      SendNetworkData(ConnectionID, @Anfrage$, Len(Anfrage$))
      Durchlauf = 1
    EndIf

    If EventGadgetID()=7  ;>>>>  Kopieren
      Inhalt$=GetGadgetText(6)
      SetClipboardText(Inhalt$)
      SetGadgetText(5,Status7$)       ;Status : Antwort wurde in die Zwischenablage kopiert.
      MessageRequester("Info","Kopieren wurde gedrückt.",0)
    EndIf

  EndIf

  If EventID = #PB_EventCloseWindow
    Exit=1
    FreeMemory(Puffer)
  EndIf
 
Until Exit=1
End

Client:
  If ConnectionID And Durchlauf
    If Durchlauf = #MaxAnzahlErfolgloserVersuche
      CloseNetworkConnection(ConnectionID)
      ConnectionID=0
      Durchlauf=0
      Antwort$=""
      DisableGadget(7, 0)     ;Kopieren-Button aktivieren - Antwort ist komplett
      SetGadgetText(5,Status6$)     ;Status : Antwort erhalten.
    Else
      NCE = NetworkClientEvent(ConnectionID)
        If NCE=2
          Laenge = ReceiveNetworkData(ConnectionID,*Puffer,#Puffergroesse)
          If Laenge > 0
            Packet$=PeekS(*Puffer,Laenge)
            While Laenge=#Puffergroesse
              Laenge = ReceiveNetworkData(ConnectionID,*Puffer,#Puffergroesse)
              Packet$=Packet$+PeekS(*Puffer,Laenge)
            Wend
            If Len(Antwort$)+Len(Packet$) < #MaxGroesseDerAntwort
              Antwort$ = Antwort$ + Packet$
            Else
              Antwort$ + Left(Packet$, #MaxGroesseDerAntwort - Len(Antwort$))
              Durchlauf = #MaxAnzahlErfolgloserVersuche ;indirekter Abbruch per Obergrenze - s.o.
            EndIf
            SetGadgetText(5,Status5$) ;Status : Antwort ist noch nicht komplett.
            SetGadgetText(6,Antwort$)
          EndIf
        ElseIf NCE=3
          ReceiveNetworkFile(ConnectionID,Antwort$)
      Else
        Durchlauf=Durchlauf+1
      EndIf
    EndIf
  EndIf  
Return
Benutzeravatar
uweb
Beiträge: 461
Registriert: 13.07.2005 08:39

Beitrag von uweb »

Ich konnte nicht schlafen. Und habe die Kiste noch einmal angeworfen.

Mit der neu überarbeiteten Version klappt es jetzt auch mit den Gadgets.

Es läuft also so weit.

Ich würde mich trotzdem über Antworten freuen.


>>> Es nett wenn ich Feedback bekäme, ob das überhaupt jemanden interesiert.

>>> Kann mir jemand sagen wie das Ende bei HTTP definiert ist ?

>>> Habt ihr Beispiele für Anfragen mit anderen Protokollen und wisst etwas über deren Ende-Bedingung ?

(Bitte keine RFC's o.ä.)

Danke im voraus !

Code: Alles auswählen

Lokal = 1

LAnfrage$ = "GET /isapi.htm HTTP/1.1\r\nRequest Method: GET\r\nRequest "
LAnfrage$ = LAnfrage$ + "URI: /isapi.htm\r\nRequest Version: HTTP/1.1\r\nHost: 192.168.2.2\r\n"
LAnfrage$ = LAnfrage$ + "User-Agent: Mozilla/5.0 (Windows; U; Win98; de-DE; rv:1.5a)"
LAnfrage$ = LAnfrage$ + " Gecko/20030728 Mozilla Firebird/0.6.1\r\n"
LAnfrage$ = LAnfrage$ + "Accept: text/xml,application/xml,application/xhtml+xml,text/html"
LAnfrage$ = LAnfrage$ + ";q=0.9,text/plain;q=0.8,video/x-mng,image/png,image/jpeg,image/gif"
LAnfrage$ = LAnfrage$ + ";q=0.2,*/*;q=0.1\r\nAccept-Language: de-DE,de;q=0.8,en-us;q=0.5,en"
LAnfrage$ = LAnfrage$ + ";q=0.3\r\nAccept-Encoding: gzip,deflate\r\nAccept-Charset:"
LAnfrage$ = LAnfrage$ + " ISO-8859-15,utf-8;q=0.7,*;q=0.7\r\nKeep-Alive: 300\r\n"
LAnfrage$ = LAnfrage$ + "Connection: keep-alive\r\n\r\n"
LAnfrage$ = ReplaceString(LAnfrage$, "\r\n", Chr(13)+Chr(10)) 

RAnfrage$ = "GET /search?hl=de&q=%22PureBasic+4.0%22&btnG=Google-Suche&meta= HTTP/1.1\r\n"
RAnfrage$ = RAnfrage$ + "Host: www.google.de\r\n"
RAnfrage$ = RAnfrage$ + "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; de; rv:1.8.0.1)"
RAnfrage$ = RAnfrage$ + " Gecko/20060111 Firefox/1.5.0.1\r\n"
RAnfrage$ = RAnfrage$ + "Accept: text/xml,application/xml,application/xhtml+xml"
RAnfrage$ = RAnfrage$ + ",text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\n"
RAnfrage$ = RAnfrage$ + "Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3\r\n"
RAnfrage$ = RAnfrage$ + "Accept-Encoding: deflate\r\n"
RAnfrage$ = RAnfrage$ + "Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n"
RAnfrage$ = RAnfrage$ + "Keep-Alive: 300\r\n"
RAnfrage$ = RAnfrage$ + "Connection: keep-alive\r\n"
RAnfrage$ = RAnfrage$ + "Referer: http://www.google.de/\r\n"
RAnfrage$ = RAnfrage$ + "Cookie: PREF=ID=f5a427e63799b096:TM=1136453808:LM=1136453808"
RAnfrage$ = RAnfrage$ + ":S=EcP1dNcr76ya93hs\r\n\r\n"
RAnfrage$ = ReplaceString(RAnfrage$, "\r\n", Chr(13)+Chr(10)) 

Text1$=Chr(13)+Chr(10)+"Bitte IP oder Port ggf. ändern und *Verbinden* drücken."
ReplaceString(Text1$, "*", Chr(34), 2)

Text2$=Chr(13)+Chr(10)+"Bitte IP oder Port ändern und *Verbinden* drücken."
ReplaceString(Text2$, "*", Chr(34), 2)

Text3$=Chr(13)+Chr(10)+"Bitte Anfrage ggf. ändern und *Senden* drücken,"
ReplaceString(Text3$, "*", Chr(34), 2)

Text4$=Chr(13)+Chr(10)+"Bitte warten."
ReplaceString(Text4$, "*", Chr(34), 2)

Text5$=Chr(13)+Chr(10)+"Bitte Antwort ggf. ändern und *Kopieren* drücken,"
ReplaceString(Text5$, "*", Chr(34), 2)

Text6$=Chr(13)+Chr(10)+" oder IP bzw. Port ggf. ändern und *Verbinden* drücken."
ReplaceString(Text6$, "*", Chr(34), 2)

Status1$=""+Text1$
Status2$="Server ist nicht erreichbar."+Text2$
Status3$="Server ist erreichbar."+Text3$+Text6$
Status4$="Anfrage wird bearbeitet."+Text4$
Status5$="Antwort ist noch nicht komplett."+Text4$
Status6$="Antwort erhalten."+Text5$+Text6$
Status7$="Antwort wurde in die Zwischenablage kopiert."+Text5$+Text6$

OpenWindow(0, 0, 0, 300, 400, #PB_Window_SystemMenu|#PB_Window_ScreenCentered, "TestClient")

If CreateMenu(0, WindowID())
  MenuTitle("Info")
    MenuItem(1, "About")
EndIf

CreateGadgetList(WindowID())
IPAddressGadget(0, 5, 5, 145, 20)
StringGadget(1, 205, 5, 40, 20, "80")
ButtonGadget(2, 25, 30, 100, 20, "Verbinden")
ButtonGadget(3, 175, 30, 100, 20, "Senden")
EditorGadget(4, 5, 55, 290, 290, "")

TextGadget(5, 5, 350, 290, 45, Status1$ ,#PB_Text_Border ) ;>>> Status: Bitte Verbinden

Senden=1                              ; 0/1 für Modus Kopieren/Senden

If Lokal                              ; 0/1 für Remote/Lokal
  SetGadgetState(0,MakeIPAddress(127,0,0,1))
  Anfrage$ = LAnfrage$
Else
  SetGadgetState(0,MakeIPAddress(064,233,183,103))
  Anfrage$ = RAnfrage$
EndIf

SetGadgetText(4,Anfrage$)
DisableGadget(3, 1)
DisableGadget(4, 1)
   
#Puffergroesse = 1426                 ; beliebige Größe

*Puffer=AllocateMemory(#Puffergroesse)

ConnectionID=0                        ; 0 bedeuted offline
Durchlauf=0                           ; Zählvariable - 0 bedeuted offline
                                      ; geht bis #MaxAnzahlErfolgloserVersuche 
#MaxAnzahlErfolgloserVersuche=128
#MaxGroesseDerAntwort=63999

If InitNetwork()=0
  MessageRequester("Fehler", "kein TCP/IP-Stack auf dem System verfügbar.", 0)
EndIf

AddKeyboardShortcut(0, #PB_Shortcut_F1, 1)
DetachMenu() 

Repeat

  Gosub Client

  If Durchlauf
    Delay(1)
    EventID=WindowEvent()
  Else
    EventID=WaitWindowEvent()
  EndIf
  
  If EventID=#PB_Event_Menu
    If EventMenuID()=1
      MessageRequester("Info","TestClient von Uwe Beisler",0)
    EndIf
  EndIf
 
  If EventID=#PB_Event_Gadget

    If EventGadgetID()=2  ;>>>>  Verbinden  
      Senden=1
      DisableGadget(3, 1)             ; Button deaktivieren
      DisableGadget(4, 1)             ; Editor deaktivieren
      SetGadgetText(3,"Senden")
      SetGadgetText(4, Anfrage$)
      SetGadgetText(5,"Versuche Server zu erreichen.")
      Host$=GetGadgetText(0)
      Port$=GetGadgetText(1)
      ConnectionID.l = OpenNetworkConnection(Host$,Val(Port$))
      If ConnectionID = 0
        SetGadgetText(5,Status2$)     ;>>> Status : Server ist nicht erreichbar.
      Else
        SetGadgetText(5,Status3$)     ;>>> Status : Server ist erreichbar.
        DisableGadget(3, 0)           ; Button aktivieren
        DisableGadget(4, 0)           ; Editor aktivieren
      EndIf
    EndIf

    If EventGadgetID()=3
      If Senden           ;>>>>  Senden
        Senden=0
        DisableGadget(3, 1)           ; Button deaktivieren
        DisableGadget(4, 1)           ; Editor deaktivieren
        SetGadgetText(0,Host$)
        SetGadgetText(1,Port$)
        SetGadgetText(5,Status4$)     ;>>> Status : Anfrage wird bearbeitet
        Anfrage$=GetGadgetText(4)     ; - Anfrage könnte editiert worden sein
        SetGadgetText(3, "Kopieren")
        SetGadgetText(4,"")           ; Platz für Antwort Antwort schaffen 
        SendNetworkData(ConnectionID, @Anfrage$, Len(Anfrage$))
        Durchlauf = 1
      Else                ;>>>>  Kopieren
        Inhalt$=GetGadgetText(4)
        SetClipboardText(Inhalt$)
        SetGadgetText(5,Status7$)     ;>>> Status : Antwort wurde in die Zwischenablage kopiert.
      EndIf
    EndIf

  EndIf                             ; von - If EventID=#PB_Event_Gadget

  If EventID = #PB_EventCloseWindow
    Exit=1
    FreeMemory(Puffer)
  EndIf

Until Exit=1
End

Client:
  If ConnectionID And Durchlauf
    If Durchlauf = #MaxAnzahlErfolgloserVersuche
      CloseNetworkConnection(ConnectionID)
      ConnectionID=0
      Durchlauf=0
      Antwort$=""
      DisableGadget(3, 0)             ; Button aktivieren
      DisableGadget(4, 0)             ; Editor aktivieren - Antwort ist komplett
      SetGadgetText(5,Status6$)       ;>>> Status : Antwort erhalten.
    Else
      NCE = NetworkClientEvent(ConnectionID)
        If NCE=2
          Laenge = ReceiveNetworkData(ConnectionID,*Puffer,#Puffergroesse)
          If Laenge > 0
            Packet$=PeekS(*Puffer,Laenge)
            While Laenge=#Puffergroesse
              Laenge = ReceiveNetworkData(ConnectionID,*Puffer,#Puffergroesse)
              Packet$=Packet$+PeekS(*Puffer,Laenge)
            Wend
            If Len(Antwort$)+Len(Packet$) < #MaxGroesseDerAntwort
              Antwort$ = Antwort$ + Packet$
            Else
              Antwort$ + Left(Packet$, #MaxGroesseDerAntwort - Len(Antwort$))
              Durchlauf = #MaxAnzahlErfolgloserVersuche ;indirekter Abbruch per Obergrenze - s.o.
            EndIf
            SetGadgetText(5,Status5$) ;>>> Status : Antwort ist noch nicht komplett.
            SetGadgetText(4,Antwort$)
          EndIf
        ElseIf NCE=3
          ReceiveNetworkFile(ConnectionID,Antwort$)
      Else
        Durchlauf=Durchlauf+1
      EndIf
    EndIf
  EndIf  
Return
Benutzeravatar
bluejoke
Beiträge: 1244
Registriert: 08.09.2004 16:33
Kontaktdaten:

Beitrag von bluejoke »

Hallo!

Das interessiert mich durchaus. und zwar ganz gewaltig. Nur bin ich, wie deem auch zwischendurch total aus PB ausgestiegen (noch bevor ich ganz drin war). Weil ich momentan nur einen speziellen Server konnektiere kann ich auch mehr hard-coden, später möchte ich das ganze aber gern variabler gestalten.
Ich denke, das #EOF is bei HTTP immer "Connection: close"

Simon
Ich bin Ausländer - fast überall
Windows XP Pro SP2 - PB 4.00
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag von PMV »

Also auf ein "</html>" sollteste vielleicht suchen. Als ich grad mich mal dein "Remote"-Beispiel getestet hab, war das letzte was ich bekommen habe

Code: Alles auswählen

<br><font size=-1 class=p>&copy;2007 Google</font></center></body></html>

0
Hab dafür die #MaxAnzahlErfolgloserVersuche um das 10 fache
vergrößert :D

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Antworten