none
sockets -> was passiert, wenn der Empfangspuffer überläuft? RRS feed

  • Frage

  • Hallo...

    Angenommen, ich hätte eine Socket-Verbindung und der Sender sendet dauernd. Der Receiver ruft aber nie recv auf ... was passiert dann? ... wir der Sender eingebremst (sprich bekommt kein FD_WRITE mehr) ? oder gehen Daten unter Umständen verloren? ... muss ich selber dafür sorgen, dass die Puffer nicht überlaufen?

    Rudolf

    Montag, 27. Dezember 2010 21:25

Antworten

  • Hi,

    bin mir nicht mehr 100%ig sicher aber es müsste so ählich laufen:

    Der Empfänger Puffert die ankommenden Pakete, solange Speicher dafür vorhanden ist.

    Sobald der Speicher nicht ausreicht, wird das Paket als nicht empfangen dem Sender mitgeteilt (TCP vorrausgesetzt, bei UDP sind die Daten einfach weg!).

    Der Sender versucht (im Normalfall) dann daraufhin die Daten erneut zu senden, hängt als dann in einer "Senden-Schleife", da die Pakete ja nie ankommen können.

    Sobald der Empfänger den Puffer ausliest, wird wieder Speicher frei und kann weitere Daten empfangen, woraufhin der Sender nun wieder die nächsten Pakete senden kann.

    Also kurz gesagt, sollte sich das dann im send() beim Sender bemerkbar machen, da er keine Daten schicken konnte (ist aber kein SOCKET_ERROR, sondern einfach ein send() mit 0 geschriebenen Bytes).

    Gruß,

      Peter


    When someone helps you, have a heart and try to help others!
    Samstag, 1. Januar 2011 17:43

Alle Antworten

  • Hi,

    bin mir nicht mehr 100%ig sicher aber es müsste so ählich laufen:

    Der Empfänger Puffert die ankommenden Pakete, solange Speicher dafür vorhanden ist.

    Sobald der Speicher nicht ausreicht, wird das Paket als nicht empfangen dem Sender mitgeteilt (TCP vorrausgesetzt, bei UDP sind die Daten einfach weg!).

    Der Sender versucht (im Normalfall) dann daraufhin die Daten erneut zu senden, hängt als dann in einer "Senden-Schleife", da die Pakete ja nie ankommen können.

    Sobald der Empfänger den Puffer ausliest, wird wieder Speicher frei und kann weitere Daten empfangen, woraufhin der Sender nun wieder die nächsten Pakete senden kann.

    Also kurz gesagt, sollte sich das dann im send() beim Sender bemerkbar machen, da er keine Daten schicken konnte (ist aber kein SOCKET_ERROR, sondern einfach ein send() mit 0 geschriebenen Bytes).

    Gruß,

      Peter


    When someone helps you, have a heart and try to help others!
    Samstag, 1. Januar 2011 17:43
  • klingt einleuchtend... danke...

    Rudolf

    Montag, 3. Januar 2011 16:22
  • Das ganze gilt natürlich nur bei TCP und nicht bei UDP!


    Jochen Kalmbach (MVP VC++)
    Montag, 3. Januar 2011 16:42