Entwickler-Ecke
Internet / Netzwerk - ReadBuffer mit Synapse?
nabbl - Mi 16.08.06 23:40
Titel: ReadBuffer mit Synapse?
Hallo!
Ich habe bisher immer die Indy-Komponenten benutzt und kam mit diesen auch ganz gut klar.
Da ich nun aber Cross-Plattform (mit CrossKylix) programmiere und Indy einfach nicht zum laufen bekommen habe, bin ich auf die Synapse-Sammlung umgestiegen.
Nun suche ich etwas wie bei Indy "TCP.ReadBuffer". Habe schon geguckt und fand "TCP.RecvBuffer". Nur sind da leider die Parameter andere und daher kann man mit der "blcksock"-Unit von Synapse keine records empfangen.
Der zu empfangene Record sieht folgendermaßen aus:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| TMsg_Refresh = packed record Name : array[1..32] of string[PLAYERNAME_CHARS]; Team : array[1..32] of byte; Kills : array[1..32] of word; Deaths : array[1..32] of word; Ping : array[1..32] of byte; Number : array[1..32] of byte; IP : array[1..32,1..4] of byte; TeamScore : array[1..4] of word; MapName : string[16]; TimeLimit, CurrentTime : integer; KillLimit : word; GameStyle : byte; end; |
Diesen kann ich auch nicht ändern, da er so vom Server gesendet wird. Wie kann ich nun mit Synapse diesen record empfangen? "TCP.RecvBuffer" akzeptiert nur pointer...
Bitte helft mir :cry: :)
Martok - Mi 16.08.06 23:50
Delphi-Quelltext
1: 2: 3: 4:
| var myRec:TMsg_Refesh; begin TCP.RecvBuffer(@myRec,sizeof(myRec)); ... |
Sollte dein Problem lösen. Der @-Operator erzeugt einen Pointer auf den Record. Mich würde mal interssieren, wie du das vorher mit Indy hattest, eigentlich sollte das so ähnlich sein.
nabbl - Mi 16.08.06 23:55
Delphi-Quelltext
1:
| TCP.ReadBuffer(RefreshMsg, sizeof(RefreshMsg)); |
Hmm... ich mache nun folgendes:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| begin TCP.RecvBuffer(@RefreshMsg, sizeof(RefreshMsg)); for i:= 1 to 32 do begin try playernames.Add(RefreshMsg.Name[i-1]); playerkills.Add(IntToStr(RefreshMsg.Kills[i-1])); playerdeaths.Add(IntToStr(RefreshMsg.Deaths[i-1])); playerip.Add(inttostr(RefreshMsg.IP[i-1][1])+'.'+inttostr(RefreshMsg.IP[i-1][2])+'.'+inttostr(RefreshMsg.IP[i-1][3])+'.'+inttostr(RefreshMsg.IP[i-1][4]) ); playernumber.Add(IntToStr(RefreshMsg.Number[i])); finally WriteLn('Refreshed...'); WriteLn(playernames.strings[0]); end; end; |
Da kommt allerdings nur murks raus (vgl. Anhang) :(
nabbl - Do 17.08.06 00:26
sry 4 doppelpost
Narses - Do 17.08.06 00:49
Moin!
Delphi-Quelltext
1:
| TCP.RecvBuffer(@RefreshMsg, sizeof(RefreshMsg)); |
IMHO muss das "@" weg, das ist doch vermutlich als var deklariert. ;)
cu
Narses
nabbl - Do 17.08.06 01:09
öhm...
Martok hat folgendes geschrieben: |
Delphi-Quelltext 1: 2: 3: 4:
| var myRec:TMsg_Refesh; begin TCP.RecvBuffer(@myRec,sizeof(myRec)); ... |
Sollte dein Problem lösen. Der @-Operator erzeugt einen Pointer auf den Record. Mich würde mal interssieren, wie du das vorher mit Indy hattest, eigentlich sollte das so ähnlich sein. |
was denn nun?
Narses - Do 17.08.06 01:14
Moin!
Probier´s doch einfach aus oder zeig die Parameter-Deklaration der Methode. ;)
cu
Narses
Martok - Do 17.08.06 01:35
Also deklariert ist die wie folgt:
Delphi-Quelltext
1: 2: 3:
| TMemory = pointer; ..... function RecvBuffer(Buffer: TMemory; Len: Integer): Integer; override; |
(zufälligerweise hab ich die Synapse-Doku vor mir ;) )
Also eigentlich braucht man schon das @.
Eventuell mal den Rückgabewert prüfen, ob der gleich Len ist. Wenn nicht, wurde der Record nicht vollständig 'befüllt', was zum Beispiel passiert, wenn die Daten langsamer sind als die Ausleseroutinen.
nabbl - Do 17.08.06 09:48
Danke für eure Hilfe. Nutze wieder Indy - läuft jetzt komischerweise mit CrossKylix =)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!