Sendequeue von Client/ServerSocket
-
Hallo Mitmenschen.
Ich arbeite an einem Programm, das Informationen über ClientSocket und ServerSocket verschickt. Meine Frage: Ich möchte z.B. Daten mit SendText(...); versenden und diese auf der anderen Seite auslesen. Das ganze wird im schlechtesten Fall einige Male in der Sekunde passieren. Gibt es hierfür einen Sendequeue für die gesendeten Nachrichten, die aber noch nicht verarbeitet wurden? Oder überschreibt die letzte noch nicht verarbeitete Information die vorletzte nichtverarbeitete Information?
ich nutze als ClientType ctNonBlocking.
Gruss und vielen Dank schon mal im Voraus.
-
Generell macht TCP das für dich. Verloren gehen sollte also nichts. Allerdings solltest du dir mal in der FAQ den Thread zum Thema Protokollentwicklung ansehen. Das ist nämlich dein eigentliches Problem.

-
Dankeschön.
Ich habe es mehrfach getestet und es ging nichts verloren.
Wenn es interessiert:
Versenden
for(int x = 0; x <= 10; x++) ClientSocket->Socket->SendText("Testtext");beim auslesen kann es passieren, dass man die Strings nicht einzeln geschickt bekommt, sondern z.B. TesttextTesttextTesttextTesttext... empfängt.
Gruss
-
Rostfrei[] schrieb:
beim auslesen kann es passieren, dass man die Strings nicht einzeln geschickt bekommt, sondern z.B. TesttextTesttextTesttextTesttext... empfängt.
Genau aus diesem Grund habe ich dir den Thread über Protokollentwicklung genannt.

-
Versuche mal hinter dem zu sendenden Text einen Nullstring zu hängen. Ist ein Tipp aus der Hilfe.
mfg
Thomas
-
NaCkHaYed schrieb:
Versuche mal hinter dem zu sendenden Text einen Nullstring zu hängen. Ist ein Tipp aus der Hilfe.
Ich habe das Problem so gelöst, dass ich mir einfach ein Zeichen definiere, dass den Anfang des gesendeten Textes bildet und eins am Ende.
Somit kann ich die verketteten Meldungen wieder auseinandernehmen.void SplitCommand(AnsiString Text, AnsiString &Command, AnsiString &Parameter, AnsiString &Rest) { AnsiString ServerWrittenText = Text; ServerWrittenText.Delete(1, 1); // "<" löschen int Ende = ServerWrittenText.Pos(">"); // nach ">" suchen int DoppelPunkt = ServerWrittenText.Pos(":"); // nach Doppelpunkt suchen if(DoppelPunkt == 0) // wenn kein Doppelpunkt vorhanden Command = ServerWrittenText.SubString(1, Ende - 1); // Command extrahieren else { Command = ServerWrittenText.SubString(1, DoppelPunkt - 1); // Command extrahieren DoppelPunkt = ServerWrittenText.Pos(":"); ServerWrittenText.Delete(1, DoppelPunkt); // Command + Doppelpunkt löschen Ende = ServerWrittenText.Pos(">"); // Ende suchen Parameter = ServerWrittenText.SubString(1, Ende - 1); // Parameter extrahieren ServerWrittenText.Delete(1, Ende); // aufräumen } Command = LowerCase(Command); int x = ServerWrittenText.Pos("<"); if(x == 0) Rest = ""; else Rest = ServerWrittenText; }Funktioniert jetzt wunderbar.
Nochmals Danke.
-
Mal eine Frage in den Raum: Hat sich eigentlich mal einer die Mühe gemacht und meine 1. Antwort komplett gelesen, inkl. dem Link?
-
PuppetMaster2k schrieb:
Mal eine Frage in den Raum: Hat sich eigentlich mal einer die Mühe gemacht und meine 1. Antwort komplett gelesen, inkl. dem Link?
Auf was spielst Du an?
-
Eigentlich auf die Tatsache, das deine Vorgehensweise dem entspricht, was in dem Thread "Protokollentwicklung" von junix steht, den ich in meinem ersten Post in diesem Thread von mir gegeben habe. Scheinbar nimmt aber niemand Bezug darauf, so dass ich mich frage, ob den überhaupt jemand hier gelesen hat.
-
ich habe Deinen Post komplett gelesen und bedanke mich explizit bei Dir für diesen hilfreichen Link, der meinen Gedankenluss erst in eine erfolgreiche Richtung zu lenken vermochte. Danke.