Martin Weissbach Martin Weissbach martin.weissbach@gmx.de:
"Erik Schanze" Schanzi_@gmx.de wrote:
Hallo!
Kennt jemand eine Möglichkeit den Empfangs- und Sendepuffer eines UDP-Sockets zu löschen?
Könntest du etwas Code schicken?
z.B. die Initialisierung der Socket: --------8<------------------------------------------------------- int InitDataConn(char *pDestIP) { struct timeval tv; /* 0.5 MB as socket buffers should be enough */ int sockBufSize = 524288;
if ( lData.inSocket < 0 ) { if ( (lData.inSocket = _CreateInSocket(DATA_PORT)) == FAIL) { TRACE_DEBUG ("Could not create DataInSocket.\n"); return FAIL; }
if( setsockopt(lData.inSocket,SOL_SOCKET,SO_RCVBUF, &sockBufSize ,sizeof(sockBufSize)) == FAIL ) { AddMessage("Could not set recv buffer on DataInSocket.\n"); return FAIL; }
if( setsockopt(lData.inSocket,SOL_SOCKET,SO_SNDBUF, &sockBufSize ,sizeof(sockBufSize)) == FAIL ) { AddMessage("Could not set send buffer on DataInSocket.\n"); return FAIL; } }
if( lData.outSocket < 0 ) { if( (lData.outSocket = _CreateOutSocket(pDestIP, DATA_PORT, TRUE)) == FAIL) { TRACE_DEBUG ("Could not create DataOutSocket.\n"); return FAIL; }
if( setsockopt(lData.outSocket,SOL_SOCKET,SO_RCVBUF, &sockBufSize ,sizeof(sockBufSize)) == FAIL ) { AddMessage("Could not set recv buffer on DataOutSocket.\n"); return FAIL; }
if( setsockopt(lData.outSocket,SOL_SOCKET,SO_SNDBUF, &sockBufSize ,sizeof(sockBufSize)) == FAIL ) { AddMessage("Could not set send buffer on DataOutSocket.\n"); return FAIL; } } return OK; } --------8<------------------------------------------------------------
Dnn werden die Sockets gebunden (bind()) und verbunden (connect()), der Datenaustausch geht mit send() und recv(). Der Code ist nicht weiter spannend. ;-)
Normalerweise muss man bei UDP keine Buffer flushen, wenn du eine zuverlässige Verbindung haben willst, solltest du TCP benutzen.
Mir geht es nicht darum den Puffer zu flushen, d. h. alles zum Empfänger zu schieben, sondern zu verwerfen, entfernen, sauber machen ...
Vielleicht hatte ich meine Frage nicht gut gestellt. 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.
Freundlich grüßend,
Erik
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
El Miércoles, 14. Septiembre 2005 00:09, Josef Spillner escribió:
Wenn der (Sende-)Socket nämlich über close() geschlossen wird
Wo kein open(), da kein close()... trifft natürlich auf UDP nicht zu. Also bleibt nur der erste Absatz. Eventuell wäre noch günstig zu wissen, warum der Puffer so groß sein muss bzw. dann schnellstens gelöscht werden soll. Es gibt ja neben reinem (selbst synchronisiertem?) UDP verschiedene andere asynchrone Ansätze, die vielleicht besser auf den Anwendungszweck zugeschnitten sind.
Josef
lug-dd@mailman.schlittermann.de