Socketprogrammierung high-optimized

Alles rund um die Programmierung mit Qt
KartoffelKiffer
Beiträge: 101
Registriert: 27. Februar 2008 15:59

Beitrag von KartoffelKiffer »

Hallo,
dürfte die letzte Meldung jeweils unvollständig sein.. besonders wenn die Meldungen i.d.R. grösser sind..
Warum ist denn die letzte Meldung unvollständig? Wenn ich beim Senden hinter jede Mitteilung ein \n setze, so werden, falls mehrere Mitteilungen in einem TCP-Paket übertragen wurden, diese per split auseinander gehalten.

Sobald natürlich eine Mitteilung ein Text ist, der vielleicht mehrere \n enthält, so ist klar, dass er auch auseinander genommen wird.
Sollten dann nicht bei 1 Message/ 1ms = 1000 Messages /s sein und nicht 500 Messages/s ???
Das stimmt natürlich. Jedoch weiß ich nicht wie schnell der Sender ist, ob er auch tatsächlich 1000 Mitteilungen in der Sekunde verschickt.

Wie gesagt, so habe ich für meine Bedürfnisse das beste Ergebnis erzielt.

Ist der Ansatz denn so schon grundsätzlich nicht zu empfehlen?




Mfg KK
Zuletzt geändert von KartoffelKiffer am 19. Juni 2009 14:09, insgesamt 1-mal geändert.
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

Warum ist denn die letzte Meldung unvollständig? Wenn ich beim Senden hinter jede Mitteilung ein \n setze, so werden, falls mehrere Mitteilungen in einem TCP-Paket übertragen wurden, diese per split auseinander gehalten.
Wir haben in diesem Thread schon mehrmals gesagt, dass da ein Protokoll her muss, weil TCP ein Datenstrom (!!!!) ist und du beim Empfang nicht weisst, wie viel da schon angekommen ist.

Beispiel:
Die sender-Software schreibt mehrere Strings in den Buffer:
----------------------------------
string1\nstring2\ndies ist ein laaanger string\n
----------------------------------
Das OS macht daraus z.B. mehrere Pakete und versendet diese hintereinander:

+-----------------------+------------+
|string1\nstring2\ndies ist ein la | aanger string\n |
+-----------------------+------------+

In deinem Empfaenger-Buffer landet erstmal nur das eine Paket, worauf das Signal bei dir ausgeloest wird und du list das ganze dann:

Code: Alles auswählen

   buffer.append(is.readAll());
   QStringList splitted = buffer.split("\n"); 
das resultat:
splitted[0] = "string1"
splitted[1] = "string2"
splitted[2] = "dies ist ein la"

=> die letzte (und beim naechsten Empfang die erste) Nachricht ist zerstueckelt... daher ein Protokoll..
Antworten