AMIGA-RESISTANCE https://forum.amiga-resistance.info/ |
|
ReceiveData Fragen https://forum.amiga-resistance.info/viewtopic.php?f=38&t=3292 |
Seite 1 von 2 |
Autor: | Murmel [ 30 Nov 2012, 16:36 ] |
Betreff des Beitrags: | ReceiveData Fragen |
Hallo. Habe mal wieder ein Problem , und vieleicht kann ja jemand helfen Ich habe mich jetzt endlich mal wieder drangemacht eine Liste von Quake3 Servern und deren Ips und Ports abzuzufragen. Rausgekommen ist ein kleines Program das den Master Server von IDsoftware.com mit Protocol 68 (68 = Quake3) abfrägt, und den dann empfangenen wirrwar versucht in ips und Ports aufzulösen Das klappt im moment für die ersten ca. 98 Server ganz gut, und die werden weil sie nicht alle angezeigt werden können in der quake3serverip.txt abgespeichert. Das was der Masterserver zurücksendet wird in der masterserverdata.txt gespeichert. Zur Erklärung die IP und der Port befinden sich immer \hier\ Dabei sind ersten 4 Bytes die ip, und die letzten 2 Bytes ergeben den Port. Am Ende der Übertragen steht dann nomal ein \eot Wenn man sich nun mal die masterserverdata.txt anschaut dann gibt es leider immer abgestückelte Server am Ende einer Variable z.b \Ðd Habe schon versucht mit den Bytesgrössen rumzuhantieren, nur leider bringt es gar nichts. Vieleicht hat jemand eine Idee woran das liegen könnte? Ich habs getestet unter Win. Code: Alles auswählen @DISPLAY 1, {Title = "Quake Serverliste", Width = 1024, Height = 768, Active = True, NoClose = False ,Color = $000000} CreateUDPObject(1, 16000) ;SetNetworkTimeout(10000) ;Hallo = OpenConnection(1, "monster.idsoftware.com", 27950) data$="ÿÿÿÿgetservers 68 'full'" ip$="192.246.40.56" port = 27950 count = SendUDPData(1, data$, ip$, port) Wait (100) daten$, ip$, port = ReceiveUDPData(1) daten1$, ip1$, port1 = ReceiveUDPData(1) Wait (100) daten2$, ip2$, port2 = ReceiveUDPData(1) daten3$, ip3$, port3 = ReceiveUDPData(1) Wait (100) daten4$, ip4$, port4 = ReceiveUDPData(1) daten5$, ip4$, port5 = ReceiveUDPData(1) NPrint (count) NPrint (port) NPrint (ip$) ;data2$, count, done = ReceiveData(1, #RECEIVELINE) ;hex$ = HexStr(daten$) ;Print (daten$) len = StrLen(daten$) TextOut(#CENTER, #CENTER, len) ;Function fSaveServer2 () daten$ = ReplaceStr(daten$, "ÿÿÿÿgetserversResponse", "") OpenFile(1, "masterserverdata.txt", #MODE_WRITE) ;---Server und Pw werden in der writedatei$ gespeichert ;daten1$= HexStr (daten$) WriteLine(1, daten$) WriteLine(1, daten1$) WriteLine(1, daten2$) WriteLine(1, daten3$) WriteLine(1, daten4$) WriteLine(1, daten5$) CloseFile(1) OpenFile(1, "quake3serverips.txt", #MODE_WRITE) zaehler = 1 serverip = 0 For i = 0 To len Step 6 zaehler = zaehler + 6 If zaehler = 7 zaehler = 1 i = i + 1 serverip = serverip + 1 EndIf result1=Asc(MidStr(daten$,i,1)) result2=Asc(MidStr(daten$,i+1,1)) result3=Asc(MidStr(daten$,i+2,1)) result4=Asc(MidStr(daten$,i+3,1)) result5=Asc(MidStr(daten$,i+4,1)) result6=Asc(MidStr(daten$,i+5,1)) result7 = (result5 * 256 + result6) Print(result1,".",result2,".",result3,".",result4,":",result7) NPrint ("") Serverip$ = AddStr (Serverip$, result1) Serverip$ = AddStr (Serverip$, ".") Serverip$ = AddStr (Serverip$, result2) Serverip$ = AddStr (Serverip$, ".") Serverip$ = AddStr (Serverip$, result3) Serverip$ = AddStr (Serverip$, ".") Serverip$ = AddStr (Serverip$, result4) Serverip$ = AddStr (Serverip$, ":") Serverip$ = AddStr (Serverip$, result7) ;s$ = FormatStr("The number " .. daten$ .. " is $%c in hexadecimal notation", daten$) ;a$ = TrimStr(daten$, "/", False) ;Print (a$) ;---Server und Pw werden in der writedatei$ gespeichert ;daten1$= HexStr (daten$) WriteLine(1, Serverip$) Serverip$ = "" Next NPrint ("") NPrint (serverip, "Quake 3 Server gefunden") Serverip$ = AddStr (Serverip$, serverip) Serverip$ = AddStr (Serverip$, " Quake 3 Server gefunden") WriteLine(1, Serverip$) CloseFile(1) CloseUDPObject(1) Repeat WaitEvent Forever |
Autor: | HelmutH [ 02 Dez 2012, 14:35 ] |
Betreff des Beitrags: | Re: ReceiveData Fragen |
Hi Murmel Kann es vielleicht an einem einfachen Tippfehler liegen, wenn es denn ein Tippfehler ist: Serverip$ = AddStr (Serverip$, ":") Serverip$ = AddStr (Serverip$, result7) Bei den anderen davor steht dort nur ein Punkt. |
Autor: | Murmel [ 03 Dez 2012, 17:38 ] | |
Betreff des Beitrags: | Re: ReceiveData Fragen | |
Hi HelmutH Danke für die versuchte Hilfe:) Aber nein in der Zeile wird nur die Ip mit dem : vom Port getrennt. Es geht um diese Zeile daten$, ip$, port = ReceiveUDPData(1) wo in dem String daten$ die Antwort des Masterservers gespeichert wird. Leider werden welche am Ende abgeschnitten. Der String scheint aber nicht überzulaufen, noch kann man am ändern der Ubertragungsbytegrössen was ändern, zumindest bemerke ich keinen Unterschied. Naja vermutlich kann man nur den Andreas fragen woran das liegen könnte. |
Autor: | HelmutH [ 03 Dez 2012, 20:16 ] |
Betreff des Beitrags: | Re: ReceiveData Fragen |
Schade, wäre ja schön, wenn es sowas einfaches gewesen wäre. Leider verstehe ich vom programieren zu wenig, deshalb werde ich dir da sicherlich keine Hilfe sein um den Fehler einzugrenzen. Tipsi wäre da eher noch einer der dir hier helfen könnte, aber Andreas kann man ja auch in Deutscher Sprache anschreiben, wenn man der englischen nicht so mächtig ist. Bin gespannt woran es dann letzt endlich liegt, warum er die ip Adressen da abschneidet. |
Autor: | Tipsi [ 04 Dez 2012, 01:00 ] |
Betreff des Beitrags: | Re: ReceiveData Fragen |
Salli Murmel Ich weiss leider auch nicht, wo im Code ein Denkfehler plaziert ist. Allerdings habe ich den Verdacht, dass Hollywood bei den Strings z.B. daten$ das Zeichen nach einem "\" (Backslash) als Escape Sequences behandelt. Und in der masterserverdata.txt habe ich sehr viele dieser "\" gesehen. Da muss nur noch irgendwo ein "\0" vorkommen und Hollywood denkt, es wäre das Zeilenende. Mehr kann ich leider auch nicht sagen (oder schreiben). Wie Helmut schon mitgeteilt hat, kann dazu Andreas hoffentlich mehr erklären. In der Hilfe zu Hollywood habe ich über die Escape Sequences im Kapitel "5.3 Strings" gelesen. Leider ist mein Englisch nicht wahnsinnig ausgeprägt, so dass ich nicht alles verstand. Griessli Tipsi |
Autor: | root [ 04 Dez 2012, 23:27 ] |
Betreff des Beitrags: | Re: ReceiveData Fragen |
hmm wenn ich mir das so anschauen dann stimmt da was nicht in Zeile 26 ermittelst du die Länger des Strings len = StrLen(daten$) dann in Zeile 31 kürzt du den String daten$ = ReplaceStr(daten$, "ÿÿÿÿgetserversResponse", "") und in Zeile 49 rechnest du mit der Länge des ungekürzten Stringes For i = 0 To len Step 6 Du solltest daher lieber die Stringlänge nach dem Kürtzen nochma neu ermitteln da fehlt ja nun etwas. bissel Optimierung kann ich dir auch anbieten Zeile 65 würde ich liebe das schreiben NPrint(result1.."."..result2.."."..result3.."."..result4..":"..result7) ;Print(result1,".",result2,".",result3,".",result4,":",result7) ;NPrint ("") Zeile 68 reicht auch Serverip$= (result1.."."..result2.."."..result3.."."..result4..":"..result7) ;Serverip$ = AddStr (;Serverip$, result1) ;Serverip$ = AddStr (;Serverip$, ".") ;Serverip$ = AddStr (;Serverip$, result2) ;Serverip$ = AddStr (;Serverip$, ".") ;Serverip$ = AddStr (;Serverip$, result3) ;Serverip$ = AddStr (;Serverip$, ".") ;Serverip$ = AddStr (;Serverip$, result4) ;Serverip$ = AddStr (;Serverip$, ":") ;Serverip$ = AddStr (;Serverip$, result7) Zeile 91 (ist krass) reicht auch ;Serverip$ = AddStr (Serverip$, serverip) ;Serverip$ = AddStr (Serverip$, " Quake 3 Server gefunden") WriteLine(1, serverip.." Quake 3 Server gefunden") sorry wollt nicht motzen!!! schön zu sehen das du weiter macht! |
Autor: | Murmel [ 05 Dez 2012, 18:10 ] |
Betreff des Beitrags: | Re: ReceiveData Fragen |
ups doppelpost sorry Oo |
Autor: | Murmel [ 05 Dez 2012, 18:18 ] | |||
Betreff des Beitrags: | Re: ReceiveData Fragen | |||
Hi Tipsi Danke für die Mühe und die Idee Ich glaube das liegt dann am "\0" wenn das ein Zeilenende vorgibt. Das selbe Problem hatte ich jetzt teilweise schon mit den Hostnamen wo das "[" Zeichen einen Fehler hervoruft. Mal schauen ob mir da was einfällt. Grüsse, Murmel Jupp da haste recht. Und wer Recht hat zahlt ne Maß! Deswegen eine Fehlerhafte halbe IP Ende. Ich fragte mich schon vorher die kommt ;=) Hi Root Ne kein Problem, es fehlt nicht mehr viel, dann kannste optimieren wasde willst Das ganze ist halt schnell testweise geschrieben worden, und teilweise schon geschriebener Code der immer funkt Und der alte Müll den ich probiert habe war noch drinn. Grade überhaupt die Info zu finden was man an dem Server schicken muss, und was dann zurückkommt war nicht so leicht. Die aktuelle Version ist schon etwas besser aufgeräumt, alles in Funktionen und frägt schon 40 Server ab und Zeigt Hostnamen, Gametyp, Anzahl der Spieler, Quakeversion und die Map an. Allerdings habe ich gemerkt das ich die nachfolgenden Server nicht der Reihe nach einlesen sollte, sondern jetzt mal Testweise 3-5 parallel abfrage. Ein Wait (12) den man braucht kostet bei 40 Servern schon einiges Wartezeit. Wenn das so funktioniert wie es soll dann poste ich den neuen Code mal Grüsse Murmel |
Autor: | Murmel [ 09 Dez 2012, 06:47 ] |
Betreff des Beitrags: | Re: ReceiveData Fragen |
So die nächsten fragen Ich brauche eine Sichere Methode zum parsen. Ich weiss (Tipsi hats mir mal erklärt) das man das \ irgendwie mit "\""" ausdokumentieren kann Allerdings bekomme ich das überhaupt nicht hin. kann mur das jemand genauer erklären ? Hier mal ein Beispiel \sv_allowdownload\0\g_matchmode\0\g_gametype\3\sv_maxclients\32\sv_floodprotect\1\g_warmup\15\capturelimit\0\sv_hostname\**1up Fun Server TDM**\g_followstrict\1\fraglimit\150\timelimit\20\g_cahtime\60\g_swaproles\0\g_roundtime\3\g_bombexplodetime\40\g_bombdefusetime\10\g_hotpotato\2\g_waverespawns\0\g_redwave\15\g_bluewave\15\g_respawndelay\1\g_suddendeath\1\g_maxrounds\0\g_friendlyfire\0 8 77 ßß^2*AK*killa(*v*)ßß 8 99 ßß^4Kewlio(Xd)ßß 6 76 ßß^5Skippyßß 7 90 ßß^1Viking[kd]ßß 20 72 ßßJOSHYYYßß 25 163 ßßExplosionmasterßß 13 246 ßßho hoßß Die Spieler habe ich mit dem scharfen ßß eigenschlossen weil es selten doppelt vorkommt daten$ = ReplaceStr(daten$, "\"","ßß") Leider funktioniert das für den Rest überhaupt nicht Oo emand ne Idee ? Die Zahlen davor (Spieler) sind Frags und Ping So mal ein Snapshot wie weit ich bin. Im Moment wird der q3 masterserver wegen q3 IPs abgefragt. Ca. 200 volle (also mit Spieler) werden dann (4 gleichzeigt nach Spieldaten abgefragt). In Serverinfo wird der empfange String gezeigt. /wird er nicht gezeigt gibt es einen Fehler wegen eines Sonderzeichens) Insgesamt werden im Moment nur 50 Server angezeigt. Server die 0 zeigen haben nicht in der ResponseZeit geantwortet. Code poste ich im Moment auf Anfrage., weil ich im moment zuviel ausprobiere. Hatte heute kurz ne Umstellung auf Scuilib 0,7 Aber da das Fenster währen dee Daten lesen nicht mehr reagiert, und bei einem Server der nen Fehler liefert in der Schleife feststecken bleibt, da benütze ich lieber wieder die 0.6er http://www.file-upload.net/download-690 ... t.zip.html |
Autor: | Tipsi [ 09 Dez 2012, 13:16 ] |
Betreff des Beitrags: | Re: ReceiveData Fragen |
Salli Murmel Ein Backslash "\" kann man in Hollywood mit "\\" abfragen. Versuch doch mal den Code hier auszuführen und schaue Dir die "masterserverdata.txt" an. Hast Du sowas gesucht? Griessli Tipsi Code: Alles auswählen @DISPLAY 1, {Title = "Quake Serverliste", Width = 1024, Height = 768, Active = True, NoClose = False ,Color = $000000} CreateUDPObject(1, 16000) ;SetNetworkTimeout(10000) ;Hallo = OpenConnection(1, "monster.idsoftware.com", 27950) data$="ÿÿÿÿgetservers 68 'full'" ip$="192.246.40.56" port = 27950 count = SendUDPData(1, data$, ip$, port) Wait (100) daten$, ip$, port = ReceiveUDPData(1) daten1$, ip1$, port1 = ReceiveUDPData(1) Wait (100) daten2$, ip2$, port2 = ReceiveUDPData(1) daten3$, ip3$, port3 = ReceiveUDPData(1) Wait (100) daten4$, ip4$, port4 = ReceiveUDPData(1) daten5$, ip4$, port5 = ReceiveUDPData(1) NPrint (count) NPrint (port) NPrint (ip$) ;data2$, count, done = ReceiveData(1, #RECEIVELINE) ;hex$ = HexStr(daten$) ;Print (daten$) len = StrLen(daten$) TextOut(#CENTER, #CENTER, len) ;Function fSaveServer2 () daten$ = ReplaceStr(daten$, "ÿÿÿÿgetserversResponse", "") OpenFile(1, "masterserverdata.txt", #MODE_WRITE) ;---Server und Pw werden in der writedatei$ gespeichert ;daten1$= HexStr (daten$) WriteLine(1, daten$) WriteLine(1, daten1$) WriteLine(1, daten2$) WriteLine(1, daten3$) WriteLine(1, daten4$) WriteLine(1, daten5$) WriteLine(1, "-----") WriteLine(1, "000000") array,c=SplitStr(daten$,"\\") For k=1 To c Do WriteLine(1,array[k-1]) WriteLine(1, "000000") WriteLine(1, "------") WriteLine(1, "111111") array,c=SplitStr(daten1$,"\\") For k=1 To c Do WriteLine(1,array[k-1]) WriteLine(1, "111111") WriteLine(1, "------") WriteLine(1, "222222") array,c=SplitStr(daten2$,"\\") For k=1 To c Do WriteLine(1,array[k-1]) WriteLine(1, "222222") WriteLine(1, "------") WriteLine(1, "333333") array,c=SplitStr(daten3$,"\\") For k=1 To c Do WriteLine(1,array[k-1]) WriteLine(1, "333333") WriteLine(1, "------") WriteLine(1, "444444") array,c=SplitStr(daten4$,"\\") For k=1 To c Do WriteLine(1,array[k-1]) WriteLine(1, "444444") WriteLine(1, "------") WriteLine(1, "555555") array,c=SplitStr(daten5$,"\\") For k=1 To c Do WriteLine(1,array[k-1]) WriteLine(1, "555555") WriteLine(1, "------") CloseFile(1) OpenFile(1, "quake3serverips.txt", #MODE_WRITE) zaehler = 1 serverip = 0 For i = 0 To len Step 6 zaehler = zaehler + 6 If zaehler = 7 zaehler = 1 i = i + 1 serverip = serverip + 1 EndIf result1=Asc(MidStr(daten$,i,1)) result2=Asc(MidStr(daten$,i+1,1)) result3=Asc(MidStr(daten$,i+2,1)) result4=Asc(MidStr(daten$,i+3,1)) result5=Asc(MidStr(daten$,i+4,1)) result6=Asc(MidStr(daten$,i+5,1)) result7 = (result5 * 256 + result6) Print(result1,".",result2,".",result3,".",result4,":",result7) NPrint ("") Serverip$ = AddStr (Serverip$, result1) Serverip$ = AddStr (Serverip$, ".") Serverip$ = AddStr (Serverip$, result2) Serverip$ = AddStr (Serverip$, ".") Serverip$ = AddStr (Serverip$, result3) Serverip$ = AddStr (Serverip$, ".") Serverip$ = AddStr (Serverip$, result4) Serverip$ = AddStr (Serverip$, ":") Serverip$ = AddStr (Serverip$, result7) ;s$ = FormatStr("The number " .. daten$ .. " is $%c in hexadecimal notation", daten$) ;a$ = TrimStr(daten$, "/", False) ;Print (a$) ;---Server und Pw werden in der writedatei$ gespeichert ;daten1$= HexStr (daten$) WriteLine(1, Serverip$) Serverip$ = "" Next NPrint ("") NPrint (serverip, "Quake 3 Server gefunden") Serverip$ = AddStr (Serverip$, serverip) Serverip$ = AddStr (Serverip$, " Quake 3 Server gefunden") WriteLine(1, Serverip$) CloseFile(1) CloseUDPObject(1) Repeat WaitEvent Forever |
Autor: | Murmel [ 09 Dez 2012, 19:14 ] |
Betreff des Beitrags: | Re: ReceiveData Fragen |
Hi Tipsi Du bist Gott Diese Zeilen sind genial array,c=SplitStr(daten3$,"\\") For k=1 To c Do WriteLine(1,array[k-1]) kann nu mein umständliches Ausgeschneide umbauen Oo |
Autor: | Tipsi [ 09 Dez 2012, 20:19 ] |
Betreff des Beitrags: | Re: ReceiveData Fragen |
Salli Murmel Gott? Nö. Ich lese nur ab und zu die Dokumentation zu Hollywood. Diese zwei Zeilen stehen so als Beispiel beim Befehl SplitStr(). Griessli Tipsi |
Autor: | Murmel [ 10 Dez 2012, 00:38 ] | |
Betreff des Beitrags: | Re: ReceiveData Fragen | |
Servus Tipsi. Ja mit mehr als 100 weitere Befehlen Oo Ich habe ja auch einige Dinge geparst und zwar mit left und rightstr was auch einigermassen funktioniert. Habe aber jetzt gemerkt das ich das empfangene komplett nur speichern kann, und dann neu einlesen muss, weil HW nicht "jeden" empfangen Infostring Textlich anzeigen kann. Und ja ich gucke auch in die Hw Doku, nur wenn ich zuwenig Beispiele finde dann greife ich auf altes Basicwissen zurück. Die Scuilib kann sortieren ? ein altes Bubblesort tuts auch Aber zu Scuilib noch ne Frage damit sich der Post lohnt Scuilib Listview den Scroller oder Slider wie kann man den Grösser machen? Breitermacher ist definiert in der Default_standard.hws. Aber Länger machen weiss das einer ? Und noch eine. Das HW Icon/Symbol (links oben) wie kann man das austauschen ? Appicon wohl nicht. Grüsse, Murmel |
Autor: | Tipsi [ 10 Dez 2012, 21:42 ] |
Betreff des Beitrags: | Re: ReceiveData Fragen |
Salli Murmel Ich habe vorhin einen Blick in die ScuiLib geworfen, aber leider noch keinen Hinweis gefunden, wie man die Grösse des Knopfes im Schieberegler vergrössern könnte. Aber vielleicht werde ich noch fündig. Auf Deine zweite Frage habe ich leider auch keine Antwort. Das ist ja Windows- spezifisch. Allerdings ist es möglich, dass wenn Du @APPICON benutzt, dass dann das gewählte Icon auch im Windowsfenster oben rechts erscheint. Aber ich habe das nicht getestet. (Soviele das(s) in einem Absatz. Mein damaliger Deutschleher hätte mich ge- würgt ) Griessli Tipsi |
Autor: | root [ 11 Dez 2012, 20:43 ] |
Betreff des Beitrags: | Re: ReceiveData Fragen |
Das mit dem Icon ist ganz einfach. Du brauchst Bilder für deine Icons in bestimmten Größen und im PNG Format. Hier ist dei Zeile aus meinem Program. Code: Alles auswählen @APPICON {Ic16x16="gfx/16.png",Ic24x24="gfx/24.png",Ic32x32="gfx/32.png",Ic48x48="gfx/48.png",Ic128x128="gfx/128.png",Ic256x256="gfx/256.png",Ic512x512="gfx/512.png"} Das Beste ist du zeichnest für jede Größe ein eigenes Icon und renderst nicht einfach ein Bild auf die benötigte Größe denn dann siehts am besten aus. |
Seite 1 von 2 | Alle Zeiten sind UTC |
Powered by phpBB® Forum Software © phpBB Limited Deutsche Übersetzung durch phpBB.de |