Wie sind Blitz-Basic Netzwerkpakete aufgebaut?

Übersicht BlitzBasic Allgemein

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen

 

lordlomex

Betreff: Wie sind Blitz-Basic Netzwerkpakete aufgebaut?

BeitragSo, Feb 08, 2009 20:20
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo!
Ich möchte einen Blitz-Basic-Client mit einem in python (java-ähnliche Scriptsprache) geschriebenen Server über UDP kommunizieren lasen.
Die Verbindung klappt soweit, aber was mir das Blitzbasic-Programm schickt, kann ich nicht auslesen.
Gibt es eine Allgemeine regel was rauskommt, nachdem man ein paar readbyte und readint's gemacht hat?
womit fängt ein paketinhalt an (also der udp-teil)?
Da kommen kryptische zeichen wie '\x05' und '\x00' raus!
Kann ich die ersten x zeichen einfach weglesen??

Vielen Dank im Voraus!
Gruß Lomex

BladeRunner

Moderator

BeitragSo, Feb 08, 2009 20:33
Antworten mit Zitat
Benutzer-Profile anzeigen
http://de.wikipedia.org/wiki/U...m_Protocol
Nicht Blitz bestimmt den Aufbau der Pakete. Das Protokoll selbst gibt es vor Wink
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

lordlomex

Betreff: meinte ich anders

BeitragMo, Feb 09, 2009 17:26
Antworten mit Zitat
Benutzer-Profile anzeigen
also diese Seite kannte ich schon Very Happy
ich meinte wie die daten IM Paket. nicht den aufbau des headers.
womit werden die einzelnen daten (durch writeByte, writeLine oder writeString gesendet) getrennt?
was bedeuten die kryptischen ersten zeichen? Was kann ich aus diesen ablesen/welchen sinn haben sie?

Smily

BeitragMo, Feb 09, 2009 17:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Kurze Frage: Was hat Python bitteschön mit Java zutun? egal

Nutz Wireshark, wenn du wissen möchtest, wie ein UDP-Paket aufgebaut ist.

Ansonsten: Das musst du garnicht wissen. Es reicht, wenn beide enden wissen, dass es sich um UDP-Handelt. Genau das ist ja der zweck von UDP.
Lesestoff:
gegen Softwarepatente | Netzzensur | brain.exe | Unabhängigkeitserklärung des Internets

"Wir müssen die Rechte der Andersdenkenden selbst dann beachten, wenn sie Idioten oder schädlich sind. Wir müssen aufpassen. Wachsamkeit ist der Preis der Freiheit --- Keine Zensur!"
stummi.org
 

lordlomex

BeitragMo, Feb 09, 2009 17:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Kurze Frage: Was hat Python bitteschön mit Java zutun? egal

Hmmm.. Wenig. War die einzige leicht ähnlich Programmiersprache die mir eingefallen war, um vorzubeugen das wer fragt "was ist python?" - offensichtlich wissen das wenige BB-Fans.

Zitat:
Nutz Wireshark, wenn du wissen möchtest, wie ein UDP-Paket aufgebaut ist.

Tue ich. Ich verstehe trotzdem nicht, was die seltsamen Sonderzeichen tun.
Ich betrachte ja schon nur noch den reinen Inhalt. Ich habe aber gelesen, das dieser nicht im UDP-Protokoll festgelegt ist (wie auch, da hat jedes Programm doch eigene Anforderungen)

Zitat:
Ansonsten: Das musst du garnicht wissen. Es reicht, wenn beide enden wissen, dass es sich um UDP-Handelt. Genau das ist ja der zweck von UDP.

Das es sich um UDP handelt, wissen beide enden. Daher empfange ich ja auch die Daten. Ich kann sie nur nicht auswerten (bzw in ihre einzenlnen bestandteile zerlegen).

tedy

BeitragMo, Feb 09, 2009 18:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Aber du weist doch was du sendest...
Nach dem muster kannst du doch auch wieder lesen
01010100 01100101 01000100 01111001 00100000 00111010 01000100

Starwar

BeitragMo, Feb 09, 2009 18:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Teste mal Read/WriteLine. Read/Write-Bxte/Int/String sind nur Blitz-Intern. Die Zeichen mit dem \x benutzt Blitz um den Datentyp und die Länge herauszufiltern. (Denke ich mir mal, weil ein String eine variable länge hat und es ja irgendwelche Trennzeichen geben muss). Webserver kannst du mit Readline auslesen. Du solltest es mal so formatieren wie ein Webserver: Writeline stream,"Text"+Chr(10). Welchen Befehl du in Python brauchst weiß ich leider nicht.
MFG
 

lordlomex

BeitragMo, Feb 09, 2009 18:41
Antworten mit Zitat
Benutzer-Profile anzeigen
tedy hat Folgendes geschrieben:
Teste mal Read/WriteLine. Read/Write-Bxte/Int/String sind nur Blitz-Intern.

An diese Herangehensweise hatte ich noch nicht gedacht. Danke für den Tipp!
Dann muss ich mich um das auslesen und trennen der Infos eben selber kümmern.

Es wäre allerdings einfacher, wenn wer weiss, was die Befehler Read/Write-Bxte/Int/String genau tun.
Dann könnte ich mein python-Script so gestalten, dass es sich auch nach dem Blitz-Basic-Standard richtet und bräuchte dort nur die üblichen Read-Bxte/Int/String verwenden - String-verarbeitung in BlitzBasic scheint nämlich etwas ...eh... suboptimal zu sein.

ZaP

BeitragMo, Feb 09, 2009 18:46
Antworten mit Zitat
Benutzer-Profile anzeigen
So wie ich das verstehe hast du Probleme beim Auslesen des Streams? Du kannst dir in Python doch z.B. einfach eine ReadInt() funktion machen, die halt 4 bytes aus dem Stream liest (ein int ist 4 bytes lang..) und einen Integer daraus macht. Bytes -> 1 byte, Ints -> 4 bytes, Floats -> 4 bytes, Strings -> Nullterminiert.
Starfare: Worklog, Website (download)

Starwar

BeitragMo, Feb 09, 2009 18:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich verstehe nicht warum es mit WriteString unbedingt benutzen willst und nicht WriteLine... Aber die Größe eines Strings mit WriteString geschreiben ist ((Länge des Strings)+4) Bytes. Ich vermute die 4 Bytes sind/ist die/der Trenner.

Noobody

BeitragMo, Feb 09, 2009 19:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Starwar: Die vier Bytes bezeichnen die Länge des Strings Wink

Ich verstehe nicht, warum man für alles unbedingt Read/WriteLine verwenden will.
Damit verschenkt man bei grösseren Paketen viel zu viel Platz dafür, dass Ints/Floats zuerst in Strings umgewandelt werden plus noch zwei Bytes Linefeed und Carriage Return pro Zeile.
Ausserdem ist es sehr viel performanter, die Ints direkt auszulesen, als zuerst den String einzulesen und nachher in eine Int umzuwandeln.

Also, die kryptischen Zeichen sind wohl nichts anderes als die einzelnen Bytes des Ints, die, wenn sie als Text interpretiert werden, halt nur Krimskrams ergeben.
Ich kenne mich zwar in Python nicht aus, aber auch da sollte es möglich sein, ein einzelnes Zeichen einzulesen.
Bei Read/Writebyte reicht es, dieses Zeichen als Zahl zu interpretieren. Bei Read/Writeint muss man halt vier Zeichen einlesen, diese nochmal Bitshiften und aufsummieren.
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

Starwar

BeitragMo, Feb 09, 2009 21:27
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok, Noobody wenn du es weißt. Meine Behauptungen waren alle nur auf Vermutungen und andern Konzepten aufgebaut. Es waren lediglich Ideen. Und die frage warum nicht WriteLine war nicht rethorisch sondern ernst.
MFG
 

lordlomex

BeitragDi, Feb 10, 2009 16:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Dank für die vielen Hinweise,
Ich werde dann wohl alles in einen einzelne Zeile packen und mir selbst Trennzeichen ausdenken.
Das scheint ja hier die effizienteste Variante zu sein.
Damit ist mein Problem wohl geklärt.

Gruß Lomex

BtbN

BeitragDi, Feb 10, 2009 18:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Es ist eine absolut unzureichende Variante. Für eine Zahl die 4 Byte brauchen würde brauchst du so gut mal 15 oder mehr Byte, und du brauchst aufwändige Funktionen um das zu interpretieren.
Das BlitzBasic WriteByte tut genau das, was der Name sagt: Es schreibt ein Byte. Einfach nur ein Byte. Kein BlitzBasic-Byte, ein ganz normales Byte. Und WriteInt halt ein Int. WriteString schreibt ein Int und den String, wobei das Int die länge des Strings darstellt.
Trennzeichen gibt es nicht(nicht nur bei BlitzBasic), da sie unnötig sind, weil man sich problemlos ein Daten-Format bauen kann, was anhand der Daten-Typen arbeitet.
Es ist problemlos möglich, ein mit BB geschriebenes Byte in Python auszulesen. Wenn es bei dir nicht geht, machst du offensichtlich etwas falsch.
 

lordlomex

BeitragDi, Feb 10, 2009 22:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein, Nein!
Ich meinte das schon so, dass ich die Integer auch als Integer (also üblicherweise 4 Byte) abspeichere.
Trennzeichen werde ich trotzdem verwenden, weil ich es dann nicht nötig habe, eine Stringlänge anzugeben, und außerdem bei einem Fehler beim Schreiben dieser nur 1nen Datensatz betrifft und nicht mein komplettes Auslesen durcheinander bringt.

Mein Problem an den Blitz-Basic Befehlen war ja jetzt nur noch, das ich nicht wusste was da am Anfang einer Zeile für seltsame Zeichen eingefügt werden.
Ich habe mich jetzt aber für die Variante "selber machen" entschieden, da ich mir so auch eigene Datenstrukturen definieren und für ein effizientes Auslesen ohne das Mitsenden der Datentypen der einzelnen Elemente einsetzen kann.

BtbN

BeitragMi, Feb 11, 2009 14:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Also wenn du WriteLine anstelle von WriteString benutzt(ich nehme mal an, das meinst du mit Trennen, also das trennen von belibig langen Strings), hast du ein(bzw. zwei) trennzeichen. Nämlich das CR und LF am ende jeder "zeile".
 

Gast

BeitragMi, Feb 11, 2009 19:41
Antworten mit Zitat
mach es so:

Code: [AUSKLAPPEN]
String$ = "String|String2|4BytefürStrings(Int)|String3|Byte|USW"
WriteLine stream,sting

BladeRunner

Moderator

BeitragMi, Feb 11, 2009 23:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Das ist Bullshit, Flitztuete, denn es ist katastrophal ineffizient.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

lordlomex

BeitragMi, Feb 11, 2009 23:17
Antworten mit Zitat
Benutzer-Profile anzeigen
effizienter gehts doch gar nicht nicht, oder? (die trennzeichen hatte ich ja bereits oben begründet)

btw: kann blitzbasic auch live (!) (in wenigen millisekunden ohne jedes mal eine bibliothek zu laden) verzippen oder ähnliches komprimieren?

juse4pro

BeitragDo, Feb 12, 2009 13:04
Antworten mit Zitat
Benutzer-Profile anzeigen
wahtscheinlich nicht...

du kannst dir das ja selber programmieren.
falls es um TCP geht, macht TCP das doch automatisch...

da es um udp geht, solltest du das nicht machen, da sonst die performance runtergeht.
Portfolio |LinkedIn |XING

Gehe zu Seite 1, 2  Weiter

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group