Online Highscore,Download nich möglich :(

Für allgemeine Fragen zur Programmierung mit PureBasic.
True29
Beiträge: 283
Registriert: 18.08.2012 19:18
Computerausstattung: Windows 8 64bit .Profan x2,Purebasic 5.5
Wohnort: Worms
Kontaktdaten:

Online Highscore,Download nich möglich :(

Beitrag von True29 »

Hallo Grüßt euch,

Ich habe versucht den Code von Stargate zum Thema Highscore zum laufen zu bringen.
Jedoch bricht er leider immer beim "ReceiveNetworkData" ab. hier bekommt er keine datei größe also bzw er trägt nichts ein .
Eventuell hat von euch wer ne idee woran es liegt ?

ein test im browser:

Code: Alles auswählen

http://gravity.itm-worms.de/highscore/highscore.php?Points=123&Name=Unbekannt&Key=Pa3yTdnPphUKo
zeigt das es irgendwie an pb liegt.

hier die codes dazu:

Code: Alles auswählen

Global HighScoreKey$ = "Password"
Global HighScoreURL$ = "http://www.gravity.itm-worms.de/highscore/highscore.php"
; \\

; Lädt den Inhalt einer URL in einen String
Procedure.s DownloadToString(URL$, TimeOut = 10000)
 Protected Event, Time, Size, String$
 Protected BufferSize = $1000
 Protected *Buffer = AllocateMemory(BufferSize)
 Protected ServerName$ = GetURLPart(URL$, #PB_URL_Site)
 Protected ConnectionID = OpenNetworkConnection(ServerName$, 80)
 
 If ConnectionID
  SendNetworkString(ConnectionID, "GET "+URL$+" HTTP/1.0"+#LFCR$+#LFCR$)
  Time = ElapsedMilliseconds()
  Repeat
   Delay(10)
   Event = NetworkClientEvent(ConnectionID)
  Until Event Or ElapsedMilliseconds()-Time > TimeOut      
  If Event
   Repeat
     Size = ReceiveNetworkData(ConnectionID, *Buffer, BufferSize)
     Debug "get data"+ Str(size)
     
    String$ + PeekS(*Buffer, Size, #PB_Ascii)
   Until Not Size
  
   Inhalt = FindString(String$, #LFCR$, 1)
   If Inhalt
    ProcedureReturn Mid(String$,Inhalt+3)
   Else
    ProcedureReturn String$
   EndIf   
  ElseIf ElapsedMilliseconds()-Time > TimeOut
   Debug "Connection TimeOut!"
  EndIf
Else
  Debug "Verbindung fehlgeschlagen!"
EndIf

EndProcedure


; Strukture der HighScore
Structure HighScore
 Points.l
 Name$
EndStructure
Global NewList HighScore.HighScore()


; Fügt einen Eintrag in die Internet HighScore
Procedure AddHighScoreItem(Points.l, Name$)
 Protected Points$ = Str(Points)
 Name$ = URLEncoder(Name$)
 Protected Get$ = "?Points="+Points$+"&Name="+Name$+"&Key="+DESFingerprint(Points$+Name$, HighScoreKey$)
 Debug "sent string: "+HighScoreURL$+Get$
 
 String$ = DownloadToString(HighScoreURL$+Get$)
 Debug "return string: "+String$
 
 If String$
  If String$ = "TRUE"
   Debug "HighScoreEintrag hinzugefügt."
   ProcedureReturn #True
  ElseIf String$ = "FALSE #1"
   Debug "Ungültiger Eintrag!"
  ElseIf String$ = "FALSE #2"
   Debug "Fehler beim eintragen (bzw. schreiben in die Datei)!"
  ElseIf String$ = "FALSE #3"
   Debug "Identischer Eintrag!"
  Else
   Debug "Unbekannter Fehler!"
   Debug String$   
  EndIf
 Else
  Debug "Download fehlgeschlagen!"
 EndIf 
EndProcedure


; Lädt die Internet HighScore runter
;  Dabei kann ab einem bestimmten Platz (Start)
;  eine bestimmte Menge (Count) runtergeladen werden.
Procedure ExamineHighScore(Start=1, Count=0)
 Protected Get$, Position, OldPosition, Item$
 ClearList(HighScore())
 If Count > 0
  Get$ = "?from="+Str(Start)+"&to="+Str(Start+Count)
 Else
  Get$ = "?from="+Str(Start)
 EndIf
 String$ = DownloadToString(HighScoreURL$+Get$)
 If String$
  Repeat
   Position = FindString(String$, Chr(13), OldPosition+1)
   If Position
    Item$ = Mid(String$, OldPosition+1, Position-OldPosition-1)
    AddElement(HighScore())
    HighScore()\Points = Val(StringField(Item$, 1, Chr(9)))
    HighScore()\Name$ = StringField(Item$, 2, Chr(9))
    OldPosition = Position
   EndIf
  Until Not Position
  ResetList(HighScore())
  ProcedureReturn #True
 Else
  Debug "Download fehlgeschlagen!" 
 EndIf
EndProcedure

; Springt zum nächsten HighScore Eintrag (der Download-HighScore)
Macro NextHighScoreItem()
 NextElement(HighScore())
EndMacro

; Gibt die Punkte des HighScore Eintrags zurück
Macro GetHighScorePoints()
 HighScore()\Points
EndMacro

; Gibt den Namen des HighScore Eintrags zurück
Macro GetHighScoreName()
 HighScore()\Name$
EndMacro


If InitNetwork()
  
  Punkte = 123
  Name$ = "Unbekannt"
  Debug AddHighScoreItem(Punkte, Name$)
  
  
  ExamineHighScore()
  While NextHighScoreItem()
    Debug Str(GetHighScorePoints())+"   "+GetHighScoreName()
  Wend
  
EndIf

PHP dateien :

Code: Alles auswählen

<?php

 // Diese Variable bitte selber den eigenen wünschen nach anpassen!
 //
 $HighScoreKey = 'Password';
 //


 // Sortierung nach Punkten
 function SortPoints($a,$b)
  {
  If     ($a[0]<$b[0]) Return  1;
  ElseIf ($a[0]>$b[0]) Return -1;
  Else                 Return  0;
  }


 // Neuer Highscore Eintrag
 If ($_GET['Points'])
  {
  $_GET['Name'] = urldecode($_GET['Name']);
  If (crypt($_GET['Points'].$_GET['Name'], $HighScoreKey) == $_GET['Key'])
   {
   include 'highscorelist.php';
   ForEach($Item As $Unit)
    {
    If ( ($Unit[0]==$_GET['Points']) And ($Unit[1]==$_GET['Name']) )
     {
     echo 'FALSE #3';
     exit;
     }
    }
   If ($File = @fopen('highscorelist.php', 'a'))
    {
    // Eintrag in die Datei schreiben
    fwrite($File, '$Item[] = array('.$_GET['Points'].', "'.$_GET['Name'].'");'.chr(13));
    fclose($File);
    echo 'TRUE';
    }
   Else
    {
    echo 'FALSE #2';
    }
   }
  Else
   {
   echo 'FALSE #1';
   }
  }
 // Highscore auslesen
 Else
  {
  include 'highscorelist.php';
  usort($Item,SortPoints);
  If ($_GET['from']>0) $_GET['from']--;
  Else                 $_GET['from']=0;
  If ($_GET['to']>0)   $_GET['to']--;
  Else                 $_GET['to']=count($Item);
  For($n=$_GET['from'];$n<$_GET['to'];$n++)
   {
   // ausgabe der Highscore
   echo $Item[$n][0].chr(9).$Item[$n][1].chr(13);
   }
  }
 
?>
Highscorelist:

Code: Alles auswählen

<?php
$Item = Array();
i7,12gb ram , Windows 10 ,Purebasic 5.50
True29
Beiträge: 283
Registriert: 18.08.2012 19:18
Computerausstattung: Windows 8 64bit .Profan x2,Purebasic 5.5
Wohnort: Worms
Kontaktdaten:

Re: Online Highscore,Download nich möglich :(

Beitrag von True29 »

keiner eine Idee ?

Grüße.
i7,12gb ram , Windows 10 ,Purebasic 5.50
Andesdaf
Moderator
Beiträge: 2673
Registriert: 15.06.2008 18:22
Wohnort: Dresden

Re: Online Highscore,Download nich möglich :(

Beitrag von Andesdaf »

mit PB 5.20 macht GET keine Probleme. Allerdings ergeben die nachfolgenden Auswertungen
für mich keinen Sinn.

Die Rückgabe vom Server wird so korrekt ausgegeben (unabh. davon ob die überhaupt stimmt,
da hatte ich jetzt keine Lust, das zu überprüfen):

Code: Alles auswählen

Global HighScoreKey$ = "Password"
Global HighScoreURL$ = "http://www.gravity.itm-worms.de/highscore/highscore.php"
; \\

; Lädt den Inhalt einer URL in einen String
Procedure.s DownloadToString(URL$, TimeOut = 10000)
 Protected Event, Time, Size, String$
 Protected BufferSize = $1000
 Protected *Buffer = AllocateMemory(BufferSize)
 Protected ServerName$ = GetURLPart(URL$, #PB_URL_Site)
 Protected ConnectionID = OpenNetworkConnection(ServerName$, 80)
 
 If ConnectionID
  SendNetworkString(ConnectionID, "GET "+URL$+" HTTP/1.0"+#LFCR$+#LFCR$)
  Time = ElapsedMilliseconds()
  Repeat
   Delay(10)
   Event = NetworkClientEvent(ConnectionID)
  Until Event Or ElapsedMilliseconds()-Time > TimeOut     
  If Event
   Repeat
     Size = ReceiveNetworkData(ConnectionID, *Buffer, BufferSize)
     Debug "get data"+ Str(size)
     
    String$ + PeekS(*Buffer, Size, #PB_Ascii)
   Until Not Size
 
   Inhalt = FindString(String$, #LFCR$, 1)
   If Inhalt
    ProcedureReturn Mid(String$,Inhalt+3)
   Else
    ProcedureReturn String$
   EndIf   
  ElseIf ElapsedMilliseconds()-Time > TimeOut
   Debug "Connection TimeOut!"
  EndIf
Else
  Debug "Verbindung fehlgeschlagen!"
EndIf

EndProcedure


; Strukture der HighScore
Structure HighScore
 Points.l
 Name$
EndStructure
Global NewList HighScore.HighScore()


; Fügt einen Eintrag in die Internet HighScore
Procedure AddHighScoreItem(Points.l, Name$)
 Protected Points$ = Str(Points)
 Name$ = URLEncoder(Name$)
 Protected Get$ = "?Points="+Points$+"&Name="+Name$+"&Key="+DESFingerprint(Points$+Name$, HighScoreKey$)
 Debug "sent string: "+HighScoreURL$+Get$
 
 String$ = DownloadToString(HighScoreURL$+Get$)
 Debug "return string: "+String$
 
 If String$
  If FindString(String$, "TRUE")
   Debug "HighScoreEintrag hinzugefügt."
   ProcedureReturn #True
  ElseIf FindString(String$, "FALSE #1")
   Debug "Ungültiger Eintrag!"
  ElseIf FindString(String$, "FALSE #2")
   Debug "Fehler beim eintragen (bzw. schreiben in die Datei)!"
  ElseIf FindString(String$, "FALSE #3")
   Debug "Identischer Eintrag!"
  Else
   Debug "Unbekannter Fehler!"
   Debug String$   
  EndIf
 Else
  Debug "Download fehlgeschlagen!"
 EndIf
EndProcedure


; Lädt die Internet HighScore runter
;  Dabei kann ab einem bestimmten Platz (Start)
;  eine bestimmte Menge (Count) runtergeladen werden.
Procedure ExamineHighScore(Start=1, Count=0)
 Protected Get$, Position, OldPosition, Pos2, Pos3, Item$
 ClearList(HighScore())
 If Count > 0
  Get$ = "?from="+Str(Start)+"&to="+Str(Start+Count)
 Else
  Get$ = "?from="+Str(Start)
 EndIf
 String$ = DownloadToString(HighScoreURL$+Get$)
 If String$
  Repeat
   Position = FindString(String$, Chr(13), OldPosition+1)
   If Position
    Item$ = Mid(String$, OldPosition+1, Position-OldPosition-1)
    AddElement(HighScore())
    Pos2 = FindString(Item$, "(") + 1
    Pos3 = FindString(Item$, ")")
    Item$ = Mid(Item$, Pos2, Pos3 - Pos2)
    HighScore()\Points = Val(StringField(Item$, 1, ","))
    HighScore()\Name$ = Trim(Trim(StringField(Item$, 2, ",")), Chr(34))
    OldPosition = Position
   EndIf
  Until Not Position
  ResetList(HighScore())
  ProcedureReturn #True
 Else
  Debug "Download fehlgeschlagen!"
 EndIf
EndProcedure

; Springt zum nächsten HighScore Eintrag (der Download-HighScore)
Macro NextHighScoreItem()
 NextElement(HighScore())
EndMacro

; Gibt die Punkte des HighScore Eintrags zurück
Macro GetHighScorePoints()
 HighScore()\Points
EndMacro

; Gibt den Namen des HighScore Eintrags zurück
Macro GetHighScoreName()
 HighScore()\Name$
EndMacro


If InitNetwork()
 
  Punkte = 123
  Name$ = "Unbekannt"
  Debug AddHighScoreItem(Punkte, Name$)
 
 
  ExamineHighScore()
  While NextHighScoreItem()
    Debug Str(GetHighScorePoints())+"   "+GetHighScoreName()
  Wend
 
EndIf
Win11 x64 | PB 6.20
Benutzeravatar
Bisonte
Beiträge: 2476
Registriert: 01.04.2007 20:18

Re: Online Highscore,Download nich möglich :(

Beitrag von Bisonte »

Schonmal versucht das ganze im ASCII - Modus zu kompilieren ?

Unicode und Netzwerk ist immer so eine Sache ... und in der Standardeinstellung ist die IDE auf Unicode Kompilat gestellt
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​​
True29
Beiträge: 283
Registriert: 18.08.2012 19:18
Computerausstattung: Windows 8 64bit .Profan x2,Purebasic 5.5
Wohnort: Worms
Kontaktdaten:

Re: Online Highscore,Download nich möglich :(

Beitrag von True29 »

Hallo. Danke für die antwort ich benutze pb5.11
Eventuell gibt's da ja en Fehler.
Werde das mit unicode mal testen .
i7,12gb ram , Windows 10 ,Purebasic 5.50
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Online Highscore,Download nich möglich :(

Beitrag von STARGÅTE »

DownloadToString hat einen kleines Fehler drin.
Die Stelle mit FindString (um den Inhalt der Seite ohne Header zu bekommen) muss so heißen:

Code: Alles auswählen

   Inhalt = FindString(String$, #CRLF$+#CRLF$, 1)
   If Inhalt
    ProcedureReturn Mid(String$,Inhalt+4)
   Else
    ProcedureReturn String$
   EndIf
Ansonsten liegt es vermutlich ehr daran, dass die Website, also das php-Script eine Seite in Unicode oder UTF-8 erzeugt hat.
Da DownloadToString diese Datei aber als Ascii lesen will, könnte das Probleme machen.
Bei PureBasic ist es dabei egal, ob Unicode oder Ascii benutzt wird.
PHP muss (zumindest mit wieder Auslesemethode) in Ascii formatiert sein
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
True29
Beiträge: 283
Registriert: 18.08.2012 19:18
Computerausstattung: Windows 8 64bit .Profan x2,Purebasic 5.5
Wohnort: Worms
Kontaktdaten:

Re: Online Highscore,Download nich möglich :(

Beitrag von True29 »

FindString der fehler war leider nicht schuld.

denke eher dann wohl das 2 mit " php-Script eine Seite in Unicode oder UTF-8"
wie löse ich dieses Problem wer eine Idee ?
Also wie schreibe ich das php script um das es mit Ascii arbeitet ?

Grüße.
i7,12gb ram , Windows 10 ,Purebasic 5.50
Benutzeravatar
HeX0R
Beiträge: 3070
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: Online Highscore,Download nich möglich :(

Beitrag von HeX0R »

Entschuldige, ich fürchte ich habe beim Testen einige Zeilen zu Deiner Highscore-Liste hinzugefügt.
Ich blicke bei diesem Code ehrlich gesagt nicht wirklich durch, der ist mir zu verwirrend.
Aber die "DownloadToString"-Prozedur ist so nicht wirklich vernünftig ausgeführt.
Versuche es mal so:

Code: Alles auswählen

; Lädt den Inhalt einer URL in einen String
Procedure.s DownloadToString(URL$, TimeOut = 10000)
	Protected Event, Time, Size, Inhalt, String$, Result.s
	Protected BufferSize   = $1000
	Protected *Buffer      = AllocateMemory(BufferSize)
	Protected ServerName$  = GetURLPart(URL$, #PB_URL_Site)
	Protected ConnectionID = OpenNetworkConnection(ServerName$, 80)

	If ConnectionID
		SendNetworkString(ConnectionID, "GET " + URL$ + " HTTP/1.0" + #LFCR$ + #LFCR$)
		Time = ElapsedMilliseconds() + TimeOut
		Repeat
			Select NetworkClientEvent(ConnectionID)
				Case 0
					Delay(5)
				Case #PB_NetworkEvent_Data
					Size = ReceiveNetworkData(ConnectionID, *Buffer, BufferSize)
					If Size > 0
						String$ + PeekS(*Buffer, Size, #PB_Ascii)
					EndIf
				Case #PB_NetworkEvent_Disconnect
					;Server disconnects normaly, if packet is finished
					CloseNetworkConnection(ConnectionID)
					ConnectionID = 0
					Inhalt       = FindString(String$, #CRLF$ + #CRLF$, 1)
   				If Inhalt
   					Result = Mid(String$,Inhalt + 4)
   				EndIf
					Break
			EndSelect

		Until ElapsedMilliseconds() > Time
		If Result
			;anything o.k.
		ElseIf ConnectionID = 0
			Debug "Server closed connection!"
		Else
			Debug "Connection Timeout! (time: " + Str(time) + "; Elapsed: " + Str(ElapsedMilliseconds()) + ")"
			CloseNetworkConnection(ConnectionID)
		EndIf
	Else
		Debug "Verbindung fehlgeschlagen!"
	EndIf
	
	ProcedureReturn Result
EndProcedure
True29
Beiträge: 283
Registriert: 18.08.2012 19:18
Computerausstattung: Windows 8 64bit .Profan x2,Purebasic 5.5
Wohnort: Worms
Kontaktdaten:

Re: Online Highscore,Download nich möglich :(

Beitrag von True29 »

nun gut danke für eure hilfe werde das ganze neu schreiben.
i7,12gb ram , Windows 10 ,Purebasic 5.50
Antworten