Autor Beitrag
fanspiraphi
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Fr 15.08.08 22:15 
Hallo allerseits,

ich sende und empfange mit einer Client und Server Anwendung lokal diesen record:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
type
  rbuf = record
    key:string[255];
    msg:string[255];
    color:tcolor;
    Left:integer;
    Top:integer;
    item:string[255];
    accept:string[255];
    username:string[255];
    target:string[255];
    location:string[255];
    eq:string[255];
    image:string[255];
    typ:string[255];
    sender:string[255];
    hp:integer;
    hit:integer;
    hpmax:integer;
end;


Empfangen wird er so:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
  Socket: TCustomWinSocket);
var l:integer;
begin
l:=socket.ReceiveLength;
socket.ReceiveBuf(buf,l);


Nun werden manchmal ziemlich schnell hintereinander zwei dieser Records versendet, die dann verschmelzen. Dieses wirr-warr versucht man dann wieder in den Record zu Pressen, was nicht funktioniert und somit bekomme ich eine CPU- und Fehlermedlung und mein Programm stürzt ab.

Ich habe leider keine Idee wie ich statt diesem Wirr-Warr 2 Verschiedene Buffer empfange, oder verhindere dass beide Buffer auf einmal ankommen.

Ich hoffe ihr könnt mir helfen :D
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Sa 16.08.08 03:45 
Sende ein Start- und Endezeichen mit, so dass du genau weißt, wann der erste Record aufhört, und der zweite anfängt.

Aber eigentlich kannst du dich doch an der Länge orientieren? Du weißt doch, wie lang dein Record ist - und nach so viel Bytes fängt eben der zweite an..

_________________
PROGRAMMER: A device for converting coffee into software.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Sa 16.08.08 18:57 
Moin und :welcome: im Forum!

user profile iconfanspiraphi hat folgendes geschrieben:
ich sende und empfange mit einer Client und Server Anwendung lokal diesen record:
FAQ-Beitrag zum Versenden von records und dyn. Objekten. :les:

user profile iconfanspiraphi hat folgendes geschrieben:
Nun werden manchmal ziemlich schnell hintereinander zwei dieser Records versendet, die dann verschmelzen.
FAQ-Beitrag zum Problem der Datenpakettrennung. :idea:

cu ;)
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
fanspiraphi Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Sa 16.08.08 23:10 
Danke für die schnelle Antwort!

Ich werde es so machen (oder zumindest Versuchen):
Eine Unit programmieren die den record rbuf in einen String umwandelt welcher ungefähr so aussehen wird:
ausblenden Delphi-Quelltext
1:
2:
var s:string;
s:='#START#KEYtest#USERNAMEname#LOCATIONort...#END';

sowie eine prozedur die das ganze wieder zurückverwandelt.
dabei kann beim zurückverwandeln der string auch so aussehen:
ausblenden Delphi-Quelltext
1:
2:
var s:string;
s:='blablablaunsinn...#START#KEYtest#USERNAMEname#LOCATIONort...#ENDblablablaunbsinnoderwasweisichwas';

Diesen record kann ich wie gewohnt verwenden, ohne viele änderungen vorzunehmen. Der Umgewandelte String wird jeweils per Sendtext und recivetext gesendet/empfangen.

Hat jemand Verbesserungs / andere Vorschläge


PS.:Ist das dann schon ein Protokoll? Danke Narses hast mir sehr geholfen :D
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 18.08.08 20:48 
Moin!

user profile iconfanspiraphi hat folgendes geschrieben:
Hat jemand Verbesserungs / andere Vorschläge
Kann man so machen.

Ich würde allerdings eine Kommandosequenz daraus bauen und von Records auf Objects umsteigen; eine .AsCmdSeq- und eine .PickupCmdSeq(AInboundFrameList: TInboundFrameList)-Methode dazu entwerfen, fertig. ;)

user profile iconfanspiraphi hat folgendes geschrieben:
Ist das dann schon ein Protokoll?
Klar, es gibt ja Daten- und Steuerzeichen (wenn auch überflüssig viele ;)).

user profile iconfanspiraphi hat folgendes geschrieben:
Danke Narses hast mir sehr geholfen :D
Bitte. :D

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.