AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Socket Buffer

Ein Thema von Aphton · begonnen am 20. Jun 2010 · letzter Beitrag vom 20. Jun 2010
Antwort Antwort
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#1

Socket Buffer

  Alt 20. Jun 2010, 18:31
Ahoi liebe Gemeinde,
Habe schon lang nichts mehr gefragt
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
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#2

AW: Socket Buffer

  Alt 20. Jun 2010, 22:25
...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
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#3

AW: Socket Buffer

  Alt 20. Jun 2010, 22:31
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
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG

Geändert von Aphton (20. Jun 2010 um 22:35 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#4

AW: Socket Buffer

  Alt 20. Jun 2010, 23:31
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 setsockopt(socket, SOL_SOCKET, SO_RCVBUF,...) beeinflussen.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:22 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