2016-03-21 3 views
1

Ich arbeite mit einer Anwendung, die jetzt hauptsächlich blockierende Sockets mit select() Timeouts verwendet, aber mit der Write-Funktion verwende ich nicht blockierende Sockets mit send(). Ich muss nur wissen, unter welchen (und allen) Umständen wird() EWOULDBLOCK/EAGAIN zurücksenden?Wann wird send() EWOULDBLOCK zurückgeben?

+1

Ich bin mir nicht sicher, ob ich die Frage verstehe, oder vielleicht verstehen Sie die Dokumentation nicht. 'send()' gibt entweder 'EAGAIN' oder' EWOULDBLOCK' zurück, wenn sich der Socket im nicht blockierenden Modus befindet und der Aufruf aus irgendeinem Grund blockiert wird. Auf die Spezifikationen wird nicht näher eingegangen, und die Details wären in jedem Fall umsetzungsspezifisch. Für einige Implementierungen bedeutet dies, dass nicht genügend freier Speicherplatz im Sendepuffer vorhanden ist, um die gesamte Nachricht aufzunehmen, aber die Pufferungsdetails sind wiederum implementierungsspezifisch. –

+1

@JohnBollinger Für alle Implementierungen. Sendepuffer sind in der Dokumentation erwähnt. Sie sind kein Implementierungsdetail. – EJP

Antwort

2

Linux Manpage send() sagt:

Wenn die Nachricht passt nicht in den Sendepuffer des Sockels, send() normalerweise blockiert, es sei denn, die Buchse in nonblocking platziert wurde I/O Modus. Im nicht blockierenden Modus würde es in diesem Fall mit dem Fehler EAGAIN oder EWOULDBLOCK fehlschlagen. Der Select (2) -Ruf kann verwendet werden, um zu bestimmen, wann es möglich ist, mehr Daten zu senden.

und

Rückgabewerte EAGAIN oder EWOULDBLOCK: Die Buchse ist nicht blockierend markiert und die angeforderte Operation blockieren würde. POSIX.1-2001 ermöglicht entweder Fehler zu für diesen Fall zurückgegeben werden, und erfordert nicht diese Konstanten haben den gleichen Wert, so sollte eine portable Anwendung für beide Möglichkeiten prüfen.

Verwandte Themen