Entwickler-Ecke

Internet / Netzwerk - TCP/IP Records zu lang


fanspiraphi - Fr 15.08.08 22:15
Titel: TCP/IP Records zu lang
Hallo allerseits,

ich sende und empfange mit einer Client und Server Anwendung lokal diesen record:

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:

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 - 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..


Narses - Sa 16.08.08 18:57
Titel: Re: TCP/IP Records zu lang
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 [http://www.delphi-library.de/topic_Probleme+beim+SendenEmpfangen+von+records++dyn+Objekten_60793.html]. :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 [http://www.delphi-library.de/topic_Datenpakete+bei+den+SocketKomponenten+auseinanderhalten_56194.html]. :idea:

cu ;)
Narses


fanspiraphi - 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:

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:

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 - 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 [http://www.delphi-forum.de/topic_TNBFPA+SocketKompos+mit+Protokollfunktionen_71223.html] 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