Autor Beitrag
mtin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 177

Win XP SP2
BDS2006 Enterprise
BeitragVerfasst: So 30.10.05 20:52 
tja, da ich grad Ferien un extrem viel Zeit hab hab ich mir gedacht, ich erweiter mal meine Kenntnisse im TCP-Bereich und probier nen Nachbau des Messengers Xfire

da dessen Protokoll nicht offiziell dokumentiert ist, muss ich mich auf die einzige dokumentation die existiert verlassen, und zwar
www.fryx.ch/xfire/protocol.html

allerdings fangen da auch schon meine Probleme an, dort sehen die Beispiele der Paktete verdammt kompliziert aus, ich hab keine Ahnung wie ich das mittels eines IdTCPClient/Server lösen sollte, der client hat ja nur sendCMD
also wenn da auf der Seite steht ich soll folgendes Paket an den xfire server schicken, weiß ich nicht wie ich das mit delphi machen muss!

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
magicNumber 00 type(18) 00 numberOfAtts //skins and versions of skins are 1 

attribute_length 'skin' 04 01 numberOfSkins 00 lengthOfNextSkin 00 nameOfSkin LengthOfNextSkin 00 nameOfSkin (..andSoOn..) 

attribute_length 'version' 04 02 numberOfSkins 00 (forEachSkin){ 01 00 00 00 } 12 00 03 00 01 

attribute_length 'version' 02 versionNumber 00 00 00

Example
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
00000004 33 00 12 00 02 04 73 6b 69 6e 04 01 02 00 08 00 3.....sk in......

00000014 53 74 61 6e 64 61 72 64 05 00 58 66 69 72 65 07 Standard ..Xfire.

00000024 76 65 72 73 69 6f 6e 04 02 02 00 01 00 00 00 01 version. ........

00000034 00 00 00 12 00 03 00 01 07 76 65 72 73 69 6f 6e ........ .version

00000044 02 19 00 00 00


Ein weiteres Problem ist, dass mein Programm scheinbar einfriert sobald ich den laut dokumentation 1. befehl mit client.sendCMD('UA01',-1); hinschicke!

gleich das nächste Problem ist, dass ich nicht weiß auf welchen Port ich den IdTCPServer einstellen muss. Ich hab mit einem netzwerk-sniffer mehrere Protokolle der xfire-verbindungen aufgezeichnet und der Lokale Port an den der xfire-Server die antworten schickt ändert sich jedes mal (im gegensatz zum immer gleich bleibenden Port beim Server)

also tut mir leid falls jetzt hier jemand mitm Kopf schüttelt und sich fragt was ich eigentlich will, hab mehr oder weniger kaum Erfahrung mit solchen sachen und wär auch für allgemeine TCP-Hilfen/Tutorials/wasauchimmer dankbar!
digi_c
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1905

W98, XP
D7 PE, Lazarus, WinAVR
BeitragVerfasst: Mo 31.10.05 09:46 
Könntest du mal kurz erklären was xFire ist?

Du musst glaube ich extra einen Datentyp erstellen, der diesen Byte Aufbau hat und die Informationen mit Hilfe einer Variablen dieses Typs verschicken.
mtin Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 177

Win XP SP2
BDS2006 Enterprise
BeitragVerfasst: Mo 31.10.05 11:18 
hö? was soll ich machen?

also xfire ist ein normaler Messenger wie Yahoo oder ICQ, nur eben das er extra für gamer entwickelt wurde und z.b. anzeigt welches spiel man gerade spielt und eine chatfunktion aus dem spiel heraus besitzt.
Aber so weit will ich ja gar nicht gehen :D mir würde es reichen wenn ich irgendwie normale chatnachrichten an meine Freunde versenden kann...nur hab ich dafür eben zuwenig Ahnung von diesem TCP-kram (ich schaff nicht mal die authentifizierung am xfire Server)

also wenn ich mit etheral die Pakete aufzeichne, dann sehen die ja dort auch immer so "3-geteilt" aus, also ganz links irgendwas, in der Mitte die Hexadezimal-zahlen und rechts irgendwie eine "übersetzung" (mit den viele Punkten)
Eben z.B. so:
ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
00000004 33 00 12 00 02 04 73 6b 69 6e 04 01 02 00 08 00 3.....sk in......   

00000014 53 74 61 6e 64 61 72 64 05 00 58 66 69 72 65 07 Standard ..Xfire.   

00000024 76 65 72 73 69 6f 6e 04 02 02 00 01 00 00 00 01 version. ........   

00000034 00 00 00 12 00 03 00 01 07 76 65 72 73 69 6f 6e ........ .version   

00000044 02 19 00 00 00


wie muss ich sowas dann mit den Indys (oder sonstwie) machen, ich kann ja schlecht einfach das sendcmd benutzen und dann da n haufen Punkte reinsetzen oder? aber Hexadezimalzahlen kann ich ja auch nicht einfach senden da da ja nen string gefragt ist...is das alles verwirrend :oops:
Martin1966
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1068

Win 2000, Win XP
Delphi 7, Delphi 2005
BeitragVerfasst: Mo 31.10.05 11:26 
Hallo!

user profile iconmtin hat folgendes geschrieben:
aber Hexadezimalzahlen kann ich ja auch nicht einfach senden da da ja nen string gefragt ist


Also ich glaube kaum das die Indy Komponenten nur das senden von Strings unterstützen. Du musst dir halt einen Buffer anlegen und dort die entsprechend Daten einfügen und dann mit hilfe von Indy verschicken. Schau dir mal die Indy Komponenten genauer an. Die müssten auf jeden Fall mehrere Methoden haben und Daten zu verschicken.

Martin

_________________
Ein Nutzer der Ecke ;-)
mtin Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 177

Win XP SP2
BDS2006 Enterprise
BeitragVerfasst: Mo 31.10.05 16:51 
hab mal weiter rumprobiert, die Komponente IdTCPClient besitzt so nur IdTCPClient.sendCMD(string);
aber wenn ich das so schreibe dann gibts n haufen unterschiedlicher befehle, z.B.
IdTCPClient.socket.Writeln(string); und
IdTCPClient.socket.WriteBuf(irgendwas);

aber was bedeutet dieses "socket"? is das dann das gleiche wie sendCMD?
auf jeden Fall bekomme ich mit client.socket.writeln keinen Error "connection gracefully closed" wenn ich nicht den richtigen anfangsbefehl an den xfire-Server sende...
also nochmal zusammengefasst:
IdTCPClient.sendCMD('UA01'); -->Programm hängt sich auf...
IdTCPClient.sendCMD('blablatest'); -->"connection gracefully closed"
IdTCPClient.socket.Writeln('UA01'); -->...nix...
IdTCPClient.socket.Writeln('blablatest'); -->...nix...

und wie funktioniert das dann mit dem buffer anlegen?

und was is mit meiner 3. Frage, wie ich den tcpserver einstellen muss wenn sich der port anscheinend immer ändert?
digi_c
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1905

W98, XP
D7 PE, Lazarus, WinAVR
BeitragVerfasst: Di 01.11.05 10:58 
Socket ist die Bezeichnung für eine Netzwerkverbindung als das was eigentlich einen Port aufmacht.

Du musst das IMHO so machen wie ich oben sagte.
1.Einen Datentyp anlegen, der den Aufbau so hat wie es die xfire Doku beschreibt.
2.Eine Variable dieses Typs anlegen und mit den gewünschten Werten belegen
3.Diese Variable an einen Socket senden also nicht per String sondern z.B. per Stream.
mtin Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 177

Win XP SP2
BDS2006 Enterprise
BeitragVerfasst: Di 01.11.05 19:28 
wie müsste ich da vorgehen?
tut mir leid wenn ich jetzt vielleicht nerve ;) aber ich hab bisher immer nur einfache Datentypen erstellt...(also z.B. mit nem string, float, integer und nem array drin oder so)
wie könnte ich denn den Datentyp für die Pakete machen?

[url=img91.imageshack.us/...php?image=da8nn.jpg]user defined image[/URL]
auf folgendem Screenshot ist nochmal eins zu sehen, links das von der "Dokumentation" und rechts das was ich selbst aufgezeichnet habe...ich müsste also einen Datentyp erstellen in den ich dann die (rot gekennzeichneten) Hexadezimalzahlen eintrage und das ganze dann abschicken?

gibts denn dazu nirgends n kleines Beispiel / tutorial?
das muss doch jemand schonmal gemacht haben :((
GTA-Place
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Di 01.11.05 19:46 
Wie wäre es, wenn du einfach mit Indy (IdIRC) zu einem IRC-Server verbindest?
Ist in der Regel einfacher (aber nur in der Regel... :roll:) und
niemand brauch einen Account um den Chat zu benutzen.

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
mtin Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 177

Win XP SP2
BDS2006 Enterprise
BeitragVerfasst: Di 01.11.05 19:50 
ne es geht je eben gerade darum dass ich versuchen will dass xfire-Protokoll nachzubauen ;)
GTA-Place
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
EE-Regisseur
Beiträge: 5248
Erhaltene Danke: 2

WIN XP, IE 7, FF 2.0
Delphi 7, Lazarus
BeitragVerfasst: Di 01.11.05 19:57 
K. Dachte du willst vielleicht einfach nur ein kleines Chat-Tool proggen.


PS: Mir ist gerade aufgefallen, dass ich XFire auf dem PC habe.
Hat sich mit Americas Army installiert. Wusste gar nicht was das ist :wink: .

_________________
"Wer Ego-Shooter Killerspiele nennt, muss konsequenterweise jeden Horrorstreifen als Killerfilm bezeichnen." (Zeit.de)
digi_c
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1905

W98, XP
D7 PE, Lazarus, WinAVR
BeitragVerfasst: Mi 02.11.05 09:42 
So wie ich mir das denke benötigst du Wissen über RECORDS und in denen musst du dann die Datenabfolge wie in der Doku nachbilden. So funzt das IMHO auch bei komplexer Kommunikation mit DLLs.
mtin Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 177

Win XP SP2
BDS2006 Enterprise
BeitragVerfasst: Mi 02.11.05 16:37 
jaja, das ist mir schon klar aber warum brauch ich das?
ich müsste einfach nur einen Variablentyp kennen den ich mit diesen Hex-zeichen belegen kann...

hab jetzt von nem netten java-programmierer nen xfire-client mit source bekommen, da macht der das folgendermaßen:

ausblenden Java
1:
2:
3:
4:
5:
6:
7:
8:
9:
    byte[] packet = { 0x33, 0x00, 0x12, 0x00, 0x02, 0x04, 0x73, 0x6b, 0x69,
        0x6e, 0x04, 0x01, 0x02, 0x00, 0x08, 0x00, 0x53, 0x74, 0x61,
        0x6e, 0x64, 0x61, 0x72, 0x64, 0x05, 0x00, 0x58, 0x66, 0x69,
        0x72, 0x65, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e,
        0x04, 0x02, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00,
        0x00, 0x00, 0x12, 0x00, 0x03, 0x00, 0x01, 0x07, 0x76, 0x65,
        0x72, 0x73, 0x69, 0x6f, 0x6e, 0x02, version, 0x00, 0x00, 0x00 };

    output.write(packet);


also er gibt in ne Variable einfach diese Hexzeichen ein...
ich denke das müsste doch in delphi auch gehen oder?
und dafür bräuchte ich doch auch nicht zwingendermaßen einen eigenen Datentyp?


un womit ich immer noch Probleme habe ist meinen TCPServer richtig einzustellen...
wie kann ich denn bei meinem TCPclient festlegen, von welchem port aus das gesendet wird?
(also nicht an welchen, das hab ich schon hinbekommen ;) )
hab gedacht das wär client.socket.boundport aber da bekomm ich ne exception wenn ich dem einen Port zuweise bevor ich connected bin, und danach bringt es nix mehr, dann hat er sich schon scheinbar zufällig irgendeinen Port gesucht...
Stefan.Buchholtz
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 612

WIN 2000, WIN XP, Mac OS X
D7 Enterprise, XCode, Eclipse, Ruby On Rails
BeitragVerfasst: Mi 02.11.05 17:53 
Du kannst natürlich auch selbst einen Puffer definieren und füllen. Die Möglichkeit, ein Array zur Laufzeit in einem Statement zu erzeugen und zu initialisieren, wie der Java-Code das macht, existiert in Delphi so leider nicht.

Du kannst natürlich feste Daten in einem Konstanten-Array ablegen, so:

ausblenden Delphi-Quelltext
1:
2:
const
  PACKET : array[0..n] of Byte = ($33$00, ...);


Für einen Sende-Puffer mit variablen Inhalt kannst du auch ein Byte-Array benutzen - ob das eine feste oder variable Grösse hat, hängt natürlich vom Protokoll ab, das ich nicht kenne.
Ob es nun wirklich einfacher ist, deine Datenpakete in einem Byte-Array selbst zu konstruieren statt eine entsprechende record-Struktur zu definieren, weiss ich acuh nicht - hängt auch wieder vom Protokoll ab. Wenn die XFire-Datenpakete eine im wesentlichen feste Struktur habem würde ich eher den Record empfehlen - das ist meiner Meinung nach leichter verständlich und einfacher wartbar.

Meines Wissens kannst du bei TCP-Clientverbindungen den Client-Port gar nicht festlegen - der TCP/IP Protokollstack sucht einfach einen freien Port aus und bindet den Socket an den. Ich wüsste jetzt auch keinen Grund, warum das wichtig sein sollte - ausschlaggebend ist nur der Port, auf dem der Server auf neue Verbindungen lauscht.

Stefan
mtin Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 177

Win XP SP2
BDS2006 Enterprise
BeitragVerfasst: Mi 02.11.05 18:17 
Danke erstmal, werd das dann mal probieren, ich glaub einige Pakete sind immer gleich, die könnt ich ja dann als konstanden nehmen...und den rest eben als dyn. array...
Mein problem war, dass ich den datntyp "Byte" nicht kannte... :oops:

user profile iconStefan.Buchholtz hat folgendes geschrieben:

Meines Wissens kannst du bei TCP-Clientverbindungen den Client-Port gar nicht festlegen - der TCP/IP Protokollstack sucht einfach einen freien Port aus und bindet den Socket an den. Ich wüsste jetzt auch keinen Grund, warum das wichtig sein sollte - ausschlaggebend ist nur der Port, auf dem der Server auf neue Verbindungen lauscht.


hm, hab ich ejtzt schon wieder nen denkfehler?
ich muss doch bei meinem TCPServer, der dann die Antworten des Xfire servers empfangen soll, festlegen auf welchem Port die ankommen oder?
aber wie soll ich den angeben wenn der immer anders is??
Stefan.Buchholtz
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 612

WIN 2000, WIN XP, Mac OS X
D7 Enterprise, XCode, Eclipse, Ruby On Rails
BeitragVerfasst: Mi 02.11.05 18:50 
user profile iconmtin hat folgendes geschrieben:
user profile iconStefan.Buchholtz hat folgendes geschrieben:

Meines Wissens kannst du bei TCP-Clientverbindungen den Client-Port gar nicht festlegen - der TCP/IP Protokollstack sucht einfach einen freien Port aus und bindet den Socket an den. Ich wüsste jetzt auch keinen Grund, warum das wichtig sein sollte - ausschlaggebend ist nur der Port, auf dem der Server auf neue Verbindungen lauscht.


hm, hab ich ejtzt schon wieder nen denkfehler?
ich muss doch bei meinem TCPServer, der dann die Antworten des Xfire servers empfangen soll, festlegen auf welchem Port die ankommen oder?
aber wie soll ich den angeben wenn der immer anders is??


Schickt denn der XFire-Server die Antworten denn in einer separaten TCP-Verbindung? Bei einem "klassischen" Protokoll wie http schickt der Server seine Antworten über die gleiche Verbindung, die der Client initiiert hat - es wird keine separate Verbindung für vom Server zum Client aufgebaut. Dabei brauchst du auch keinen TCPServer für die Server-Antworten.
Kann natürlich sein, das XFire das anders macht. Dann müssen sich Client und Server natürlich irgendwie darüber einig werden, welcher Port auf dem Client-Rechner verwendet wird - das kann entweder im Protokoll festgelegt sein oder es wird irgendwie bei der Anmeldung des Clients beim Server ausgehandelt.

Stefan
mtin Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 177

Win XP SP2
BDS2006 Enterprise
BeitragVerfasst: Do 03.11.05 01:04 
ok, danke, das wusst ich nicht, denk mal dann brauch ich keinen TCPServer...

allerdings schaff ich das immer noch nicht...
also mein tcpclient hat die funktion
client.Socket.WriteDirect(Abuffer: TBytes);
das müsste ich ja benutzen oder?
wie deklariere ich aber eine Variable vom typ TBytes?
--> "Undeclared Identifier" wenn ichs versuche....

und wenn ich mir selbst das declariere mit type TBytes = array of Byte dann meckert er auch bei der Zeile (client.Socket.WriteDirect(packet);):

incompatible types: IdIOHandler.TBytes and Unit1.TBytes

versteh das nicht....
mtin Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 177

Win XP SP2
BDS2006 Enterprise
BeitragVerfasst: Do 03.11.05 18:11 
kann mir da keiner helfen?
wie sende ich mit Indy10 Bytes an den Server?

irgendwie hab ich so langsam das Gefühl, ich hab ne andere indy-version als alle hier, (fast) jedes Beispiel das ich sehe verwendet TCPClient.SendBuffer();, das gibts bei mir gar nicht...ich hab nur folgendes:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
TCPClient.SendCMD(string);

TCPClient.socket.Write(AStream:idstreamvcl oder ABuffer:TBytes);
TCPClient.socket.WriteDirect(ABuffer:TBytes);
TCPClient.socket.Writeln(string);

TCPClient.socket.writebufferopen;
TCPClient.socket.writebufferclear;
TCPClient.socket.writebufferclose;
TCPClient.socket.writebufferflush;


wie bekomm ich damit ein Array of Bytes an den Server gesendet?

Moderiert von user profile iconraziel: Delphi-Tags hinzugefügt.
digi_c
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1905

W98, XP
D7 PE, Lazarus, WinAVR
BeitragVerfasst: Do 03.11.05 22:10 
Indem du direkt mit dem Stream des indy arbeitest.
mist heute hatte ich das gemacht aber schonwieder vergessen
Jdoch sollte Suche in: Delphi-Forum, Delphi-Library INDY STREAM dir weiterhelfe, wenn nicht morgen ist auch noch ein Tag.

Da kannst du eine Variable übergeben und ihr x Bytes in dem Stream zuordnen.
Oder du baust ein dynamisches Array of byte.
mtin Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 177

Win XP SP2
BDS2006 Enterprise
BeitragVerfasst: Do 03.11.05 22:45 
JAAAAAAAAAAA!!!!!!!!!!!!!!
ICH HABS GESCHAFFT^^

ich wollt ja die ganze Zeit schon so ein array of Byte machen, aber der hat immer rumgemeckert weil es vom typ TIdBytes sein musste, und als solches konnte ich nix deklarieren(Undeclared Identifier)

nachdem ich heute nochmal stundenlang überall gesucht hab bin ich auf einen klitzekleinen google news Eintrag gestoßen:

...without forgetting to include IdGlobal and IdSocketHandle in you uses clause if it's not already done.

jetzt funktioniert das soweit und ich kann das sogar abschicken... *puh*

aber kann mir mal jemand sagen woher ich wissen soll dass ich da noch IdGlobal einbinden muss? Das steht ja auch echt nirgends 8)

Danke euch allen für eure Hilfe, jetzt kann ich endlich mit dem eigentlichen Teil anfangen :wink:
(falls ich das empfangen der Pakete hinbekommen sollte^^)

EDIT: Doch noch ne Frage: kann ich ein Array irgendwie schneller beschreiben als mit
packet[0]:=$33;
packet[1]:=$00;
...............

weil das dauert stunden wenn ich das so mache...
und wie wandel ich eigentlcih bytes in strings/strings in bytes um?
mtin Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 177

Win XP SP2
BDS2006 Enterprise
BeitragVerfasst: Do 10.11.05 16:17 
ok, da bin ich wieder mit meinem nächsten Problem :oops:

habs jetzt so weit geschafft dass ich die Pakete in dynamischen Arrays senden und auch empfangen kann. Dafür habe ich einen 2. Thread angelegt, in dem ich folgendes immer wiederhole:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
repeat
if Form1.client.IOHandler.Readable()=true  then
 begin
 setlength(packet2,0);
 Form1.client.IOHandler.ReadBytes(packet2,1,true);
 Form1.client.IOHandler.ReadBytes(packet2,packet2[0]-1,true);
 Form1.Button8click(nil);
 end;
until application.terminated=true;

also in dem ersten Byte jedes Pakets steht immer drin, wie lang das Paket ist. Ich lese also das erste Byte ein, schau wie lang das ist und les dann den Rest nach. Dann wird in meinem Hauptthread eine prozedur ausgelöst, welche dann je nach Pakettyp reagiert (im moment nur ausgabe des Pakets^^)

Dies funktioniert perfekt bei Paketen, welche "normal" sind.
Jetzt bekomme ich jedoch sobald ich mich eingelogged habe ein relativ großes Paket mit allen Informationen, Freundeliste usw. usw.
Dieses ist in einzelne Pakete unterteilt, d.h. Ich bekomme vom Server EIN TCP Paket, in diesem sind jedoch hintereinanderweg mehrere Pakete aneinander. Bsp:
Das markierte Stück gibt immer an, wie lang das nachfolgende Teilpaket ist. Sobald ein Teil zuende ist kommt wieder eine Längenangabe des nächsten Teils

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
                  0d 00 8d 00 01 05 70 72 65 66  ............pref
73 05 00 35 00 83 00 03 07 66 72 69 65 6e 64 73  s..5.....friends
04 01 01 00 04 00 6d 74 69 6e 04 6e 69 63 6b 04  ......mtin.nick.
01 01 00 04 00 6d 74 69 6e 06 75 73 65 72 69 64  .....mtin.userid
04 02 01 00 f0 67 0a 00 2c 00 84 00 02 06 75 73  .....g..,.....us
65 72 69 64 04 02 01 00 f0 67 0a 00 03 73 69 64  erid.....g...sid
04 03 01 00 01 50 d9 77 68 30 6a 81 2a 26 91 b6  .....P.wh0j.*&..
e8 aa a8 f1 1f 00 90 01 01 03 64 69 64 06 d1 9d  ..........did...
46 9c b8 a4 be 8e 6b cb 59 ae 71 31 8a 49 48 74  F.....k.Y.q1.IHt
30 64 dd 2b 00 94 00 04 03 6d 61 78 02 1e 00 00  0d.+.....max....
00 06 67 61 6d 65 69 64 04 02 00 00 03 67 69 70  ..gameid.....gip
04 02 00 00 05 67 70 6f 72 74 04 02 00 00 0f 00  .....gport......
97 00 02 19 04 02 00 00 1a 04 01 00 00 0f 00 98  ................
00 02 01 04 02 00 00 19 04 02 00 00              ............


0d = 13, 35 = 53, 2c = 44 usw.
Dies müsste ja Theoretisch mit meinem Programm auch eingelesen werden, er liest das erste Stückchen, wertet es aus, setzt das dyn. array wieder zurück und liest das nächste Teilpaket ein usw.
Doch leider wird immer nur das erste eingelesen!!!!
Hab schon versucht die Memoausgaben zu minimieren, falls vll das Paket nach ner bestimmten Zeit nicht mehr lesbar ist, doch das half auch nichts, er liest immer nur das erste dieser Pakete und das wars dann...

Ich weiß das das jetzt kompliziert klingt/aussieht aber vielleicht macht sich ja jemand die Mühe sich das durchzulesen :lol:

EDIT: Ich glaub ich hab das Problem lokalisiert! sobald ich nach diesem langen noch ein Paket erhalte, liest er zunächst alle die er von dem großen Paket "vergessen" hat ein.
kann das sein, dass TCPClient.IOHandler.Readable() auf false gesetzt wird, sobald ich einen Teil eines Pakets eingelesen habe? Was könnte ich da machen damit er das NICHT macht?

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
repeat
if Form1.client.IOHandler.Readable()=true  then
 begin
 setlength(packet2,0);
 Form1.client.IOHandler.ReadBytes(packet2,1,true);
 Form1.client.IOHandler.ReadBytes(packet2,packet2[0]-1,true);
 Form1.Button8click(nil);
 end;
until application.terminated=true;