Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Socket Buffer (https://www.delphipraxis.net/152367-socket-buffer.html)

Aphton 20. Jun 2010 17:31

Socket Buffer
 
Ahoi liebe Gemeinde,
Habe schon lang nichts mehr gefragt :D
Problematischerweise weiß ich jetzt überhaupt nicht, wie ich meine Frage direkt stellen oder mein Problem erläutern soll.. Ich versuchs mal

Also was genau geschicht eigentlich beim Empfänger, wenn man Daten über ein Socket, das per winsock.socket() erstellt wurde, via send() schickt. Ich würde genau wissen wollen, wo sich dann die Daten befinden? Gibts da ein "Buffer", in der die Daten dann eingesammelt werden? Falls ja, wie groß ist der Buffer? Wird der Buffer überschrieben, wenn neue Daten kommen und die alten Daten noch nicht ausgelsen wurden? Wie kann man das verhindern?

Problem: Wenn ich zb. ein Http-Request mache und auf Antwort warte - und zwar in ner Schleife, die per Recv() Daten empfängt, geschieht es manchmal - wenn ich zB. debugge, dass Recv() nicht alles empfängt, oder mitten beim Empfangen aufhört - dh. wenn zB. normalerweise 3x empfangen werden muss, hört er beim 2 Mal auf.
Ich schätze mal, der "Buffer", in dem alle empfangen Daten sind, die durch Recv() dann irgendwie ausgelesen werden, wird durch die Daten, die vom Server ankommen, überschrieben. Komischerweise hab ich das Problem nicht, wenn ich die Größe der zu empfangenen Bytes vergrößere.

Das ist alles nur vage und ich kanns mir irgendwie nicht erklären. Hoffe auf Erleuchtung.

Danke schon mal im voraus,
MfG

sx2008 20. Jun 2010 21:25

AW: Socket Buffer
 
Zitat:

Zitat von Aphton (Beitrag 1030415)
...dass Recv() nicht alles empfängt, oder mitten beim Empfangen aufhört ...

Das ist völlig normal bei TCP/IP.
Beim Empfangen ist es unvorhersehbar, wieviele Bytes am Stück eintreffen.
Das bedeutet für den Empfänger er muss alle Datenhäppchen selbst zu einer Botschaft zusammenfügen.
Und hier wird das Datenprotokol wichtig.
Ein einfaches und häufig genutztes Protokoll ist zum Beispiel dass jede Botschaft mit CR/LF abgeschlossen wird.
Das bedeutet man muss die mit Recv() empfangenen Daten an den Puffer mit den zuvor empfangenen Daten anhängen.
Dann den Puffer nach CR/LF duchsuchen und die Botschaft ausschneiden und verarbeiten.
Der letzte Schritt muss wiederholt werden denn es könnten weitere Botschaften im Puffer liegen.
Beispiel mit 3 Botschaften:
Code:
recv #1: 'logi'
recv #2: 'n'#13#10
recv #3: 'user '
recv #4: 'admin'#13#10'password geheim'#13#10

Aphton 20. Jun 2010 21:31

AW: Socket Buffer
 
Ja das ist mir klar, aber ich meine das nicht so.
Ich rede davon, OB es einen systeminternen Puffer gibt, wo die Daten landen, die man per "Recv()" dann ausliest...

Edit:
Ich glaube gehört zu haben, dass dieser Puffer max 8Kb groß ist.
Hier ist die Rede von Windows Systemen.

MfG

sx2008 20. Jun 2010 22:31

AW: Socket Buffer
 
Zitat:

Zitat von Aphton (Beitrag 1030471)
Ich rede davon, OB es einen systeminternen Puffer gibt, wo die Daten landen, die man per "Recv()" dann ausliest...

Natürlich gibt es diesen Puffer bei TCP.
Man kann die Grösse mit
Delphi-Quellcode:
setsockopt(socket, SOL_SOCKET, SO_RCVBUF,...)
beeinflussen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:48 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz