send_file, Subroutine
Zweck
Sendet den Inhalt einer Datei über einen Socket.
Bibliothek
Standard-C-Bibliothek (libc.a)
Syntax
Beschreibung
Die Subroutine Sendedatei sendet Daten aus der geöffneten Datei, die im Parameter Sf_iobuf angegeben ist, über das verbundene Socket, auf das der Parameter Socket-p verweist.
Parameter
| Element | Beschreibung |
|---|---|
| Socket-p | Verweist auf den Socketdeskriptor des Sockets, an den die Datei gesendet wird. Anmerkung: Dies unterscheidet sich von den meisten Socketfunktionen.
|
| Sf_iobuf | Verweist auf eine wie folgt definierte sf_parameter -Struktur:
|
Alle Felder markiert mitInputin der sf_parameter -Struktur erfordert die Einrichtung durch eine Anwendung vor den Sendedatei -Aufrufen. Alle Felder markiert mitOutputin der sf_parameter -Struktur wird von Sendedatei angepasst, wenn die Daten erfolgreich übertragen wurden, d. h., die angegebene Datenübertragung teilweise oder vollständig erfolgt ist. Die Subroutine Sendedatei versucht, Headerlänge Byte aus dem Puffer, auf den Headerdatenverweist, gefolgt von Dateibyte aus der Datei, die Dateideskriptorzugeordnet ist, gefolgt von Trailer_Länge Byte aus dem Puffer, auf den Trailer_Dataverweist, über die Verbindung zu schreiben, die dem Socket zugeordnet ist, auf den Socket-pverweist. Beim Senden der Daten aktualisiert der Kernel die Parameter, auf die von Sf_iobuf verwiesen wird, sodass die Anwendung den Befehl Sendedatei erneut ausgeben kann, ohne die Parameter immer wieder neu festzulegen oder anzupassen, wenn die Sendedatei mehrmals aufgerufen werden muss (entweder aufgrund von Signalunterbrechungen oder aufgrund des nicht blockierenden E/A-Modus), um eine Dateidatenübertragung abzuschließen. Wenn die Anwendung file_offset größer als die tatsächliche Dateigröße oder file_bytes größer als (tatsächliche Dateigröße - file_offset) setzt, ist der Rückgabewert -1 mit errno EINVAL. |
|
| Flags | Gibt die folgenden Attribute an:
Wenn das Flag SF_SCHLIE gesetzt ist, wird das durch Socket-p angegebene verbundene Socket von Sendedatei getrennt und geschlossen, nachdem die angeforderte Übertragung erfolgreich ausgeführt wurde. Der Socket-Deskriptor, auf den Socket_p verweist, wird auf -1 gesetzt. Dieses Flag wird nicht wirksam, wenn send_file einen Wert non-0 zurückgibt. Das Flag SF_REUSE wird derzeit von AIX® nicht unterstützt. Wenn dieses Flag angegeben ist, wird der Socket, auf den Socket_p zeigt, geschlossen und als -1 zurückgegeben. Für die nächste Verbindung muss ein neuer Socket erstellt werden. Sendedatei nutzt einen Netzpuffercache im Kernelspeicher, um die Ausgabedateidaten dynamisch zwischenzuspeichern. Dies trägt zur Verbesserung der Sendedatei -Leistung für folgende Dateien bei:
Anwendungen können die angegebene Datei mit dem Flag SF_DONT_CACHE aus dem Cache ausschließen. Sendedatei aktualisiert den Cache häufig, um sicherzustellen, dass die Dateidaten im Cache für einen bestimmten Zeitraum gültig sind. Der Netzoptionsparameter "send_file_duration", der vom Befehl Nein gesteuert wird, kann geändert werden, um das Intervall der Sendedatei -Cacheprüfung zu konfigurieren. Der Standardwert ist 300 (in Sekunden). Anwendungen können das Flag SF_SYNC_CACHE verwenden, um sicherzustellen, dass eine Cacheprüfung der angegebenen Datei erfolgt, bevor die Datei von Sendedateigesendet wird, unabhängig vom Wert von "send_file_duration". Weitere Parameter für den Netzpuffercache sind "nbc_limit", nbc_max_cache "und nbc_min_cache". Weitere Informationen finden Sie in der Beschreibung des Befehls Nein . |
Rückgabewert
Es gibt drei mögliche Rückgabewerte von Sendedatei:
| Wert | Beschreibung |
|---|---|
| -1 | Es ist ein Fehler aufgetreten. errno enthält den Fehlercode. |
| 0 | Der Befehl wurde erfolgreich ausgeführt. |
| 1 | Der Befehl wurde teilweise ausgeführt, einige Daten wurden übertragen, aber der Befehl muss aus irgendeinem Grund zurückkehren, z. B. wurde der Befehl durch Signale unterbrochen. |
Felder markiert mitOutputIn der Struktur sf_parameter (auf die Sf_iobufverweist) wird von Sendedatei aktualisiert, wenn der Rückgabewert 0 oder 1 ist. Das Feld Gesendete Byte enthält die Gesamtzahl Byte, die in diesem Aufruf gesendet wurden. Es ist immer wahr, dass Gesendete Byte (Output) <= Headerlänge(Input) + Dateibyte(Input) + Trailer_Länge (Input).
Der Sendedatei unterstützt den blockierenden E/A-Modus und den nicht blockierenden E/A-Modus. Im blockierenden E/A-Modus blockiert Sendedatei , bis alle Dateidaten (einschließlich Header und Trailer) gesendet wurden. Sie passt die Sf_iobuf an, um die Übertragungsergebnisse wiederzugeben, und gibt 0 zurück. Es ist möglich, dass Sendedatei unterbrochen werden kann, bevor die Anforderung vollständig ausgeführt wurde. In diesem Fall passt es die Sf_iobuf an, um den Übertragungsfortschritt widerzuspiegeln, und gibt 1 zurück.
Im nicht blockierenden E/A-Modus überträgt Sendedatei so viel, wie der Socketspeicherbereich zulässt, passt die Sf_iobuf an den Übertragungsfortschritt an und gibt 0 oder 1 zurück. Wenn kein Socket-Speicherplatz im System vorhanden ist, um die Daten zu puffern, gibt send_file -1 zurück und setzt errno auf EWOULDBLOCK. Auswählen oder Umfrage kann verwendet werden, um festzustellen, wann es möglich ist, mehr Daten zu senden.
| Mögliche zurückgegebene Fehlernummer: | |
|---|---|
| EBADF | Der Socket-oder Dateideskriptorparameter ist ungültig. |
| ENDEOSOCK | Der Socketparameter verweist auf eine Datei, nicht auf einen Socket. |
| EPROTONOUNTERSTÜTZUNG | Protokoll nicht unterstützt. |
| EFAULT | Die im Parameter HeaderTailer angegebenen Adressen befinden sich nicht in einem beschreibbaren Teil des Benutzeradressraums. |
| EINTR | Die Operation wurde durch ein Signal unterbrochen, bevor Daten gesendet wurden. (Wenn einige Daten gesendet wurden, gibt Sendedatei die Anzahl der Bytes zurück, die vor dem Signal gesendet wurden, und EINTR ist nicht festgelegt.) |
| EINVAL | Der Parameter offset, length of the HeaderTrailer, oder flags ist ungültig. |
| ENOTCONN | Ein Sendedatei an einem Socket, das nicht verbunden ist, ein Sendedatei an einem Socket, der die Verbindungssequenz nicht mit seinem Peer abgeschlossen hat oder nicht mehr mit seinem Peer verbunden ist |
| EWOULDBLOCK | Der Socket wird als nicht blockierend markiert, und die angeforderte Operation würde blockiert. |
| ENOMEM | Im System ist kein Speicher zum Ausführen der Operation verfügbar. |
PerformanceNote
Durch die Nutzung des Netzpuffercache bietet Sendedatei eine bessere Leistung und einen besseren Netzdurchsatz für die Dateiübertragung. Es wird für Dateien, die größer als 4K Byte sind, empfohlen.