Wird send () jemals blockieren, wenn select () verwendet wird?

8

Wie kann ich wissen, wie viele Daten ich ohne Blockierung senden kann, wenn ein Socket mit einem Aufruf von select() als in Ordnung zum Schreiben bezeichnet wird? (Bei vollen Sendepuffern etc.)

Bedeutet die Aufnahme in die von select() zurückgegebene Menge, dass der Socket für mindestens ein Datenbyte bereit ist, und gibt send() dann eine kurze Anzahl von geschriebenen Bytes zurück?

Oder wird es blockiert, wenn ich send() mit einem len -Parameter aufruft, der größer ist als der verfügbare Puffer? Wenn ja, woher weiß ich den Höchstbetrag?

Ich verwende reguläre C-Sockets unter Linux.

    
lxgr 15.01.2012, 21:35
quelle

2 Antworten

5

Der Aufruf send sollte beim ersten Aufruf nicht blockieren und beim ersten Aufruf mindestens ein Byte senden - vorausgesetzt, Sie verwenden ein Stream-Protokoll und gehen davon aus, dass es nicht durch ein Signal usw. unterbrochen wird sind wirklich nur zwei Möglichkeiten, um herauszufinden, wie viele Daten Sie senden können:

  1. Rufen Sie select nach jedem Aufruf von send auf, um zu sehen, ob mehr Daten gesendet werden können.

  2. Setzen Sie den Socket in den nicht blockierenden Modus und rufen Sie send auf, bis ein EAGAIN oder EWOULDBLOCK Fehler angezeigt wird.

Die zweite Option wird bevorzugt. (Die dritte Option besteht darin, dies in einem anderen Thread zu tun und den Thread einfach blockieren zu lassen, was auch eine gute Lösung ist. In der Vergangenheit waren Threading-Implementierungen nicht so ausgereift, so dass der Non-Blocking-Modus als notwendig für Hochleistung angesehen wurde Server.)

    
Dietrich Epp 15.01.2012, 21:41
quelle
4

Du kannst es nicht wissen. Sie müssen den Socket so senden, dass er nicht blockiert, und dann achten Sie auf den Rückgabewert, der Ihnen sagt, wie viel er geschrieben hat.

    
bmargulies 15.01.2012 21:36
quelle

Tags und Links