HTTPRequest für PB umbauen...

Fragen zu allen anderen Programmiersprachen.
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag von PMV »

AND51 hat geschrieben:waren aber jetzt mindestens 2 Gänge, oder? :allright:
*zurück blick* ... nach der Bremsspur da hinter dir zu urteilen würd ich
eher sagen ... das war ne Vollbremsung :mrgreen:

... naja gut, dann lassen wir mal den wohl inzwischen etwas
verschreckten Bisonte sprächen :lol: :wink:

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Nur, um nochmal sicher zu gehen: Der Gangschaltknüppel war doch der, den man hochziehen muss, oder? :wink:
Brauche diese Info dringend für meinen Führerschein! :mrgreen:

@ Bisonte:
Dann lass mal hören! <)
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Beitrag von Bisonte »

uach... ihr beiden macht mich noch wusselig :D

ja ne ... das mit den Network befehlen... Da steiger ich mich grad erst so rein...
geschweige denn das ich nen Server proggen könnt....

Das Beispiel und die Sache mit dem umbiegen werd ich mal testen.

Hatte bisher immer das DarkDragon'sche HTTP-Request unbesehen (ja mein Fehler)
benutzt.... nun seh ich ja wo's hinführt.

Verschreckt bin ich nich...

Ach übrigens... bisher hatte ich noch keine Probleme mit URLDownloadToFile_()
Verschiedene Rechner, verschiedene I-NetAnbieter, und verschiedene seiten ;)

Aber nu ab in die heia ;)
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Uahhh!
Guten Morgen!

Und wie läuft das Projekt so? :lol:

> ja ne ... das mit den Network befehlen... Da steiger ich mich grad erst so rein... geschweige denn das ich nen Server proggen könnt
IMHO ist es einfacher, als du denkst. Ich wollt ja auch schon mal einen Webserver programmieren. Habe auch damit angefangen, aber das war noch zu 3.94 Zeiten. Und dann habe ich das Projekt letzendlich doch wegen technischer Unzulänglichkeiten abgebrochen. Meine Umsetzungsstrategie wahr nicht so das wahre.

Aber wie sagt man doch so schön, Bisonte...
"Trial & Error bis zum Exzess .... " Bild :allright:
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Beitrag von Bisonte »

ähem... nu bin ich wieder wach und frage mich gerade was Du mit DownloadUrl... umbiegen meinst ?

Im ServerBeispiel hab ich jetzt alles so gelassen bis auf Port auf 80 gesetzt...

Aber langsam glaub ich das muss ins Anfängerforum ;)

Ich sag ja ... meine ersten Gehversuche mit Network befehlen....

Also in Sachen Windows-API bin ich der Antiheld :) nur zur info.. ;)
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Ach komm, das kriegen wa hin...

Also, als erstes schnappst du dir den Server-Network-beispielcode aus der Hilfe und schnallst ihn auf Port 80:

Code: Alles auswählen

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

Port = 80
*Buffer = AllocateMemory(1000)

If CreateNetworkServer(0, Port)

  MessageRequester("PureBasic - Server", "Server created (Port "+Str(Port)+").", 0)
  
  Repeat
      
    SEvent = NetworkServerEvent()
  
    If SEvent
    
      ClientID = EventClient()
  
      Select SEvent
      
        Case 1
          MessageRequester("PureBasic - Server", "A new client has connected !", 0)
  
        Case 2
          MessageRequester("PureBasic - Server", "Client "+Str(ClientID)+" has send a packet !", 0)
          ReceiveNetworkData(ClientID, *Buffer, 1000)
          MessageRequester("Info", "String: "+PeekS(*Buffer), 0)
  
        Case 3
          MessageRequester("PureBasic - Server", "Client "+Str(ClientID)+" has send a file via the network !", 0)
          ReceiveNetworkFile(ClientID, "C:\TEST_Network.ftp3")
  
        Case 4
          MessageRequester("PureBasic - Server", "Client "+Str(ClientID)+" has closed the connexion...", 0)
          Quit = 1
    
      EndSelect
    EndIf
    
  Until Quit = 1 
  
  MessageRequester("PureBasic - Server", "Click to quit the server.", 0)
  
  CloseNetworkServer(0)
Else
  MessageRequester("Error", "Can't create the server (port in use ?).", 0)
EndIf
Dann führst du diesen Code aus.
Als nächstes baust du dir einen Einzeiler mit URLDownloadToFile_(). WIchtig ist, dass du auf deinen eigenen Rechner, also mit der Adresse "localhost" oder "127.0.0.1", zugreifst!
Das sieht das so aus:

Code: Alles auswählen

Debug URLDownloadToFile_(0, "http://localhost/bla.htm", "D:\temp\bisonte.htm", 0, 0)
Nun versucht die API auf einen Webserver zuzugreifen, der "angeblich" auf deinem Computer läuft, verbindet sich zu diesen und sendet einen Request. Der beispielcode aus der Hilfe zeigt diesen Request dann an.
Bei mir sieht er so aus:

Code: Alles auswählen

GET /bla.htm HTTP/1.1
Accept: */*
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.0.3705; .NET CLR 1.1.4322; Media Center PC 4.0; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30)
Host: localhost
Connection: Keep-Alive


PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Beitrag von Bisonte »

da haste 2 minuten vor mir auf absenden gedrückt ;)
So nun hab ich das so gebastelt wie du erklärt hast.
Ich bekomme auch die gleiche meldung angezeigt.
So nun frage ich mich : Wie mache ich (vom Prinzip) so einen Request selbst ?
Also was genau muss ich da wie genau übergeben.
Also anfangen würd ich jetzt mit:

Code: Alles auswählen


Procedure SendRQ()

Protected URL.s, ConnectionID.l

ConnectionID = OpenNetworkConnection("bf2web.gamespy.com", 80)

If ConnectionID=0
  MessageRequester("Error", "Error Sending Data: Socket not connected - reconnecting", 0)
  ProcedureReturn
EndIf

URL.s="GET /ASP/" + item + additional + " HTTP/1.1" + #CRLF$
URL = URL + "Host: BF2Web.gamespy.com" + #CRLF$
URL = URL + "User-Agent: GameSpyHTTP/1.0" + #CRLF$ + #CRLF$

SendNetworkString(ConnectionID,URL)

CloseNetworkConnection(ConnectionID)

Endprocedure

Name.s="[BR]-Bisonte"

a.s="searchforplayers.aspx?nick="+Name.s
b.s="&where=b"

SendRQ(a,b)



um überhaupt was zu öffnen (Ich gehe mal davon aus es ist wie ein File öffnen...)

so und nun hab ich das mit dem daten abholen noch nicht so gerafft...


Edit:

OT: und das mit T&E bis zum Exzess ... damit hab ich schon so einiges hinbekommen.
wirkt zwar manchmal umständlich,verdreht und nicht nachvollziehbar,
aber funktioniert ;)
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Beitrag von Bisonte »

Ich hab da jetzt mal folgendes gemacht:

geklaute Procedure von Darkdragon ;) "ReceiveLine(ConnectionID)" und
dann ein bisserl das Beispiel des Servers auseinanderklamüsert....
dann folgendes gebaut:

Code: Alles auswählen

InitNetwork()

Procedure.s ReceiveLine(ConnectionID)

  Protected Text.s, Char.b
  
  Text.s = ""
  While char.b <> #LF
    char = 0
    ReceiveNetworkData(ConnectionID, @char, 1)
    If char <> 0
      Text.s + Chr(char)
    EndIf
  Wend
 
  ProcedureReturn RemoveString(RemoveString(Text, #CR$), #LF$)
EndProcedure

Procedure SendRQ(item.s, additional.s)

Protected URL.s, ConnectionID.l, Length.l, Line.s

ConnectionID = OpenNetworkConnection("bf2web.gamespy.com", 80)

If ConnectionID=0
  MessageRequester("Error", "Error Sending Data: Socket not connected - reconnecting", 0)
  ProcedureReturn
EndIf

URL.s="GET /ASP/" + item + additional + " HTTP/1.1" + #CRLF$
URL = URL + "Host: BF2Web.gamespy.com" + #CRLF$
URL = URL + "User-Agent: GameSpyHTTP/1.0" + #CRLF$ + #CRLF$

SendNetworkString(ConnectionID,URL)

    Length = 0
    Line.s = ""
    Repeat
      Line = ReceiveLine(ConnectionID)
      Debug line
      Select LCase(StringField(Line, 1, ":"))
        Case "content-length"
         
          Length = Val(Trim(StringField(Line, 2, ":")))
      EndSelect
    Until Len(Trim(Line)) <= 4

Buffer = AllocateMemory(Length)

result=ReceiveNetworkData(ConnectionID, Buffer, Length) 

CloseNetworkConnection(ConnectionID) 

ProcedureReturn Buffer
EndProcedure

Name.s="[BR]-Bisonte"

a.s="searchforplayers.aspx?nick="+Name.s
b.s="&where=b"

msg.s=PeekS(sendrq(a,b))

Debug msg
Und was soll ich sagen... Es geht... :D

Und danke AND51 ich hab sogar geschnallt wie die Sache mit dem
Request senden nun geht... Es hat ein kleiner Anschub genügt ;) thx

P.S.:

Seltsamerweise funktioniert es jetzt auch, wenn man das HTTP/1.0 angibt.
War wohl mein Request irgendwie verkehrt vorher ...

Nun kann ich mit dem Parsen anfangen ;)
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Ich habe deinen Code mal umgebaut.
Ich würde die Variable nicht 'URL' nennen, sondern 'request'. Desweiteren muss du nicht immer schreiben

Code: Alles auswählen

URL=URL+"text"
sondern

Code: Alles auswählen

URL+"text"
:allright:

Ich an deiner Stelle würde diesen Code gänzlich neu schreiben, ich würds übersichtlicher machen, etc.

Naja egal, dieser Code scheint bei mir zu funktionieren:

Code: Alles auswählen

InitNetwork()
Debug "Hallo Bisonteeee!"
Procedure.s SendRQ(item.s, additional.s) 

Protected request.s, ConnectionID.l 

ConnectionID = OpenNetworkConnection("bf2web.gamespy.com", 80) 

If ConnectionID=0 
  MessageRequester("Error", "Error Sending Data: Socket not connected - reconnecting", 0) 
  ProcedureReturn ""
EndIf 

request+"GET /ASP/" + item + additional + " HTTP/1.1"+#CRLF$ 
request+"Host: BF2Web.gamespy.com"+#CRLF$
request+"User-Agent: GameSpyHTTP/1.0"+#CRLF$
request+#CRLF$

SendNetworkString(ConnectionID,request) 

; nach dem Senden erhälst du über dieselbe ConnectionID eine Antwort zurück!

Repeat
	Delay(500) ; hier lassen wir uns zu Testzwecken extra viel Zeit
	Debug "Warte auf Antwort"
Until NetworkClientEvent(ConnectionID) = #PB_NetworkEvent_Data

Debug "Lese Daten jetzt aus"

*empfangsbuffer=AllocateMemory(8*1024*1024) ; 8 MB dürften reichen
Repeat
	Delay(100) ; hier lassen wir uns auch zu Testzwecken extra viel Zeit
Until ReceiveNetworkData(ConnectionID, *empfangsbuffer, 1000) <> 1000

CloseNetworkConnection(ConnectionID) 

ProcedureReturn PeekS(*empfangsbuffer)

EndProcedure 

Name.s="[BR]-Bisonte" 

a.s="searchforplayers.aspx?nick="+Name.s 
b.s="&where=b" 

Debug "Zeige Antwort des Servers an"
MessageRequester("SendRQ()", SendRQ(a,b))
Ich weiß allerdings nicht, ob das alle Daten sind, die zurückgegeben werden. Kenne mich mit dem Spiel und seines HTTP-Responds nicht aus.

Zur Sicherheit hier nochmal das, was ich vom Server zurückbekomme:

Code: Alles auswählen

HTTP/1.1 200 OK
Date: Sun, 02 Dec 2007 11:11:39 GMT
Server: Microsoft-IIS/6.0
cluster-server: bf2web1
X-Powered-By: ASP.NET
X-AspNet-Version: 1.1.4322
Set-Cookie: ASP.NET_SessionId=bztmgj45lpjxji34oimovy55; path=/
Cache-Control: private
Content-Type: text/html; charset=utf-8
Content-Length: 80

O
H	asof
D	1196593899
H	n	pid	nick	score
D	1	47076647	[BR]-Bisonte	23604
$	58	$
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Auch wenn du es jetzt fertig hast (ich war zu langsam :D) hier mal eine weitere Loesung :

Code: Alles auswählen

InitNetwork()

Procedure.s SendRQ(name.s)

  Protected URL.s, ConnectionID.l
  Protected result.s,buffer.s,len.l,pos.l
  
  ConnectionID = OpenNetworkConnection("bf2web.gamespy.com", 80)
  
  If Not ConnectionID     
    ProcedureReturn ""
  EndIf
  
  URL.s = "GET /ASP/searchforplayers.aspx?nick=" + name + "&where=a&sort=a HTTP/1.1" + #CRLF$
  URL   + "Host: BF2Web.gamespy.com" + #CRLF$ + #CRLF$  
  
  If SendNetworkString(ConnectionID,URL)
  
    buffer = Space(1024)
    
    While 1
      
      ne = NetworkClientEvent(ConnectionID)
      
      Select ne
        Case #PB_NetworkEvent_Data
        
        len = ReceiveNetworkData(ConnectionID,@buffer,1024)           
        
        result + buffer
        
        If len < 1024      
          Break          
        EndIf          
          
      EndSelect  
        
      
    Wend 
  
  EndIf
  
  CloseNetworkConnection(ConnectionID)
  
  pos = FindString(result,#CRLF$ + #CRLF$,1) + 3 
  
  ProcedureReturn PeekS(@result+pos)  
EndProcedure

Name.s="[BR]"

res.s = SendRQ(Name) 

OpenWindow(0,#PB_Ignore,#PB_Ignore,500,500,"test")
CreateGadgetList(WindowID(0))
EditorGadget(0,0,0,500,500)

SetGadgetText(0,res)

Repeat : Until WaitWindowEvent() = #WM_CLOSE
Antworten