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
A
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
- 1. Wann wird [MFMailComposeViewController canSendMail] zurückgeben?
- 2. Wann wird ConcurrentDictionary TryRemove false zurückgeben
- 3. Wann wird getClass(). GetName() void zurückgeben?
- 4. Wann kann Process.Start() null zurückgeben?
- 5. Wann würde ShowDialog() null zurückgeben?
- 6. Wann würde SqlCommand.ExecuteReader() null zurückgeben?
- 7. Go: Wann wird json.Unmarshal zu struct Fehler zurückgeben?
- 8. Wann wird eine gespeicherte Prozedur eine Ergebnismenge zurückgeben
- 9. Wann wird puts() fehlschlagen?
- 10. Wann kann Google NodeApi.getLocalNode null zurückgeben?
- 11. Wann würde die ItemContainerGenerator.Status-Enumeration GeneratorStatus.Error zurückgeben?
- 12. Wann kann Scala implizit null zurückgeben?
- 13. Warum wird Send Mediator nicht ausgeführt?
- 14. Wann wird instanceof FALSE zurückgegeben?
- 15. Wann wird NSURLSession ausgeführt?
- 16. Wann wird 'drawRect' aufgerufen?
- 17. Wann wird BlockingObservable.last() zurückgegeben?
- 18. Wann wird [MTAThread] verwendet?
- 19. Wann wird `componentDidMount` ausgelöst?
- 20. Wann wird DbConnection.StateChange aufgerufen?
- 21. Wann wird HttpContext.User initialisiert?
- 22. Wann wird das @ nützlich?
- 23. Wann wird onSizeChanged() aufgerufen?
- 24. Wann wird Int ++ inkrementiert?
- 25. Wann wird Ertrag verwendet?
- 26. Wann wird Control.DestroyHandle aufgerufen?
- 27. Wann wird onRestoreInstanceState aufgerufen?
- 28. Wann wird NavigationService initialisiert?
- 29. Wann wird NSCopying benötigt?
- 30. Wann wird ServiceConnection.onServiceDisconnected() aufgerufen?
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. –
@JohnBollinger Für alle Implementierungen. Sendepuffer sind in der Dokumentation erwähnt. Sie sind kein Implementierungsdetail. – EJP