El Martes, 13. Septiembre 2005 22:34, Erik Schanze escribió:
Ab einem bestimmten Zeitpunkt werden auf einen Schlag die Pakete, die noch zwischen Sender und Empfänger unterwegs sind und in den Puffern stecken, wertlos und sollten möglichst direkt in den Puffern gelöscht werden, statt sie Paket für Paket am Socket abzuholen.
Soll die Verbindung aber generell erhalten bleiben oder geschlossen werden?
Wenn sie erhalten bleiben soll, kann ich mir nur vorstellen, temporär die Größe des Puffers zu minimieren. Das führt aber zu Problemen: - manche Betriebssysteme haben eine Minimalgröße, z.B. du setzt auf 0 und es bleiben dennoch 4 kB im Puffer - Verhalten undefiniert für den Sendepuffer (müsste man mal in den Kernelquellen nachschauen...) - es könnten weitere Daten angekommen sein, die dann mit verworfen werden, je nach Protokoll - bzw. wenn nicht, kann der Socket doch geschlossen werden.
Wenn der (Sende-)Socket nämlich über close() geschlossen wird, kann man erzwingen, dass alle Daten verworfen werden, nämlich über die Linger-Option.
strunct linger linger; linger.l_onoff = 1; linger.l_linger = 0; if( setsockopt(lData.inSocket,SOL_SOCKET,SO_LINGER, &linger ,sizeof(linger)) == FAIL ) { AddMessage("Could not set zero-linger on DataInSocket.\n"); return FAIL; }
Wichtig ist, dass Linger erstmal überhaupt eingeschalten wird, aber der Zeitpunkt des Verwerfens auf 0 Sekunden (= sofort). Ist sowohl unter Linux als auch unter BSD schlecht dokumentiert, zugegeben. Der Empfangssocket ist beim close() unproblematisch.
Josef