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