Kleine TCP-Pakete

Post Reply
Message
Author
User avatar
hjb
Pro-Linux
Posts: 3264
Joined: 15. Aug 1999 16:59
Location: Bruchsal
Contact:

Kleine TCP-Pakete

#1 Post by hjb »

Hi,

in einem Programm hat sich die Notwendigkeit ergeben, in schneller Folge Datenpakete zu senden. Dazu verwende ich den send oder write System call. Das funktioniert perfekt, solange alle Datenpakete (außer dem letzten) genau so lang sind wie die MTU auf der Verbindung (längere Pakete werden von TCP automatisch fragmentiert, doch damit kommt der Empfänger nicht klar).

Wenn aber zwischendurch einmal ein kürzeres Datenpaket gesendet werden soll, passiert folgendes:

Das kurze Paket landet im Sendepuffer, wird aber nicht gesendet, weil noch Platz im Puffer ist. Das nächste Paket wird an den Puffer angehängt, wobei der Teil, der nicht mehr in den Puffer paßt, weggeworfen wird. Dieses 2-in-1-Paket wird dann gesendet.

Ich suche einen Weg, dem TCP-Stack zu sagen: "Hier habe ich 433 Bytes, sende sie weg, ohne auf einen vollen Puffer zu warten". Zwei Möglichkeiten habe ich bisher gefunden:

Aufruf von sleep(1) nach einem kurzen Paket. Doch das verzögert den Transfer zu lang.

Füllen des Puffers bis zum Ende mit Müll. Das ist OK, aber nicht ideal.

Nichts gebracht hat der Aufruf von fsync, das Warten auf einen schreibbaren Puffer mit select oder das Setzen von SO_SNDTIMEO.

Kennt jemand eine bessere Möglichkeit?

Danke,
hjb

Jochen

Re: Kleine TCP-Pakete

#2 Post by Jochen »

Das sollte sich über setsockopt(2) einstellen lassen:

<blockquote><pre><font size="1" face="">code:</font><hr><font face="Courier New" size="2">
int nodelay_flag = 1;
setsockopt (socket, IPPROTO_TCP, TCP_NODELAY, (void *) &nodelay_flag, sizeof(nodelay_flag));
</font><hr></pre></blockquote>
Passende Lektüre:
man 4 tcp
man 2 setsockopt
W. R. Stevens, "Programmieren von UNIX-Netzen", Kapitel 6.11. "Socket-Optionen" (zumindest in meiner alten Auflage)

Hoffe, dass Dir das weiterhilft!

User avatar
hjb
Pro-Linux
Posts: 3264
Joined: 15. Aug 1999 16:59
Location: Bruchsal
Contact:

Re: Kleine TCP-Pakete

#3 Post by hjb »

Hi Jochen,

genau das dürfte es sein. Ich hab den Stevens, Second Edition, hier, dort steht es in Section 7.9. Das habe ich gestern einfach übersehen.

Danke!

Gruß,
hjb
Pro-Linux - warum durch Fenster steigen, wenn es eine Tür gibt?

Post Reply