SendFile 2 C -Funktion

SendFile 2 C -Funktion
Die SendFile () ist eine Funktion, die die Daten zwischen den beiden Dateideskriptoren kopiert. Die Funktion "sendFile () ist effektiver als die Funktionen von Read (2) und schreiben (2), da sie die Daten innerhalb des Kernels kopiert, anstatt die Informationen an und vom lokalen Speicher zu senden. Wenn Sie Dateien mit der SendFile () an eine TCP -Verbindung senden möchten, jedoch einige Headerdaten vor den Datendateien übertragen müssen, können Sie die in TCP definierte TCP -Cork -Option verwenden, um die Anzahl der Pakete zu reduzieren und die Leistung zu stimmen. Hier verwenden wir den SendFile () -Systemanruf dieses Artikels. Dateien können mit dem UDP -Protokoll und einem grundlegenden Client/Server schnell übermittelt werden. Die Dateien werden durch Verschlüsselung von XOR behandelt.

Syntax der SendFile -Funktion in der C -Sprache

sendFile (int out_fd, int in_fd, off_t * offset ", size_t" "count");

Die Argumente der Size_t -Zähler sind für die Funktionsweise der Funktion erforderlich. Die vollständigen Details dieser Argumente sind wie folgt:

Die Dateideskriptoren "in fd" und "out fd" sollten zum Lesen und Schreiben zugewiesen werden. Wenn der Offset -Wert nicht null ist, bezieht er sich auf eine Variable, in der der Dateiversatz enthält, mit dem die SendFile () die Daten in FD lesen kann. Diese Variable wird auf die Bytes des Offsets aktualisiert, der nach dem letzten Byte gelesen wird, als sendFile () zurückgegeben wird. SENDFILE () ändert den aktuellen Dateiversatz von in FD nicht, wenn der Offset nicht null ist. Andernfalls wird der aktuelle Dateiversatz geändert, um die in der Nummer von „in FD“ gelesenen Bytes widerzuspiegeln. Der Count -Parameter gibt an, wie viele Bytes zwischen den Dateideskriptoren kopiert werden sollen.

Der an „FD“ geschriebene Bytesbetrag wird zurückgekehrt, wenn die Kommunikation erfolgreich ist. Es ist erwähnenswert, dass ein erfolgreicher Anruf bei SendFile () dazu führen kann, dass weniger Bytes geschrieben werden als erforderlich. Der Anrufer muss bereit sein, die Operation wiederzuholen, wenn es nicht verabreichte Bytes gibt. Auch wenn es eine Ausnahme gibt, wenn -1 bereitgestellt wird und erno angemessen eingestellt ist.

Fehler der SendFile () -Funktion in der C -Sprache

Eagain: Nicht blockierende das Schreiben sollte blockieren, da die E/A mit dem O -Nichtblock konfiguriert ist.

Ebadf: Entweder auf die Eingabe- oder Ausgabedatei konnte nicht zum Lesen oder Schreiben zugegriffen werden.

Efault: Eine falsche Adresse wurde eingegeben.

Einval: Der Deskriptor ist entweder ungültig oder gesperrt oder eine MMAP (2) -ähnliche Operation für „in FD“ ist nicht zugänglich.

Beim Lesen von „in FD“, EIO: Nicht spezifizierter Fehler.

Enomem: Aufgrund des Mangels an Erinnerung kann nicht von der „in der FD“ erwerben.

Beispiel 1: Senden Sie die Datei von der serverseitigen in der C-Sprache in Ubuntu 20 von der Sprache.04

Wir zeigen, wie die Dateien von der serverseitigen Sende gesendet werden, die im folgenden Beispiel von der Client-Seite mithilfe des SendFile-Systemaufrufs akzeptiert werden:






Wir werden nicht auf die Details zu diesem Code eingehen. Hier haben wir alle anwendbaren Header -Dateien in den Header -Abschnitt aufgenommen und einige Makros -Richtlinien definiert. Danach haben wir dann eine Funktion erstellt, um den Puffer und eine Funktionsausschreibung für die Verschlüsselung zu löschen. Dann kommt zur Int SendFile -Funktion, um die Datei zu senden.

Der Konstruktor wird für die SendFile -Funktion deklariert, in der die Datei und der Puffer definiert sind. Der Algorithmus zum Senden der Dateien an die Client-Seite wird durchgeführt. Zunächst wird der Dateiname an den Server gesendet. Wenn die Datei vorhanden ist, beginnt der Server mit dem Lesen und sendet immer wieder einen Puffer mit Daten. Bis zum Ende der Datei werden der Inhalt verschlüsselt.

Dann haben wir den Treibercode der Hauptfunktion. Innerhalb des Hauptfunktionsabschnitts haben wir die erforderlichen Variablen und strukturellen Variablen definiert. Die Funktion "send_file () sendet die Daten aus der Datei, die dem geöffneten Dateihandle über die mit der Socket zugeordnete Verbindung zugeordnet ist.

Wir haben die Socket -Funktion verwendet und die anwendbaren Parameter an sie übergeben. Wir haben die IF-ELSE-Bedingung für die Socket-Methodenvariable „Sockfd“ durchgeführt. Wenn das „Sockfd“ geringer ist als der Wert 0, wird der PRINTF aufgerufen und druckt die Anweisung des Dateideskriptors, der nicht empfangen wird. Andernfalls wird die Zusammenstellung beendet, indem die elsee Anweisung angezeigt wird. Wir haben erneut den IF-ELSE-Zustand verwendet, bei dem die Bindungsmethode für Bingungszwecke aufgerufen wird. Die BIND -Methode enthält die erforderlichen Parameter. Wenn der Bind -Methode -Vorgang gleich dem Nullwert ist, wird das „erfolgreich gebeten“ gedruckt. Wenn sie die Bedingung nicht erreicht, wird die Anweisung „Bindung fehlgeschlagen“ auf dem Eingabeaufbildungsbildschirm angezeigt.

Die while -Schleife wird für den Empfang des Dateinamens bereitgestellt. Während des Empfangens des Dateinamens wird die Anweisung "Warten auf den Dateinamen" angezeigt. Danach wird der Dateiname aus der clear_buf () empfangen. Über die "fopen" lesen wir die Datei und drucken die Nachricht "Dateiname empfangen" zusammen mit dem Dateinamen. Wenn die Datei null ist. Andernfalls wird die "erfolgreich geöffnete Datei" ausgeführt. In unserer nächsten Zeit haben wir den SendFile -Prozess durchgeführt und die Datei mit dem SendTO -Systemanruf gesendet. Am Ende ist die Datei geschlossen.

Nach der Zusammenstellung des Codes haben wir die Datei erfolgreich mit dem sendFile-Systemanruf an den Client-Server gesendet.

Beispiel 2: Senden Sie eine Datei von der Client-Seite in C-Sprache in Ubuntu 20.04
Wie wir in der vorhergehenden Instanz gesehen haben, haben wir die Datei erfolgreich an den Servercode gesendet. In diesem Fall erhalten wir die Daten aus der vom Server gesendeten Datei.




Kommen Sie einfach zur Methode „RecvFile“, bei der wir die Datei erhalten, indem wir den angegebenen Algorithmus anwenden. Ein Signal aus dem Verbindungsmodus eines Sockets oder einem verbindungslosen Modus muss von der RecvFile () -Methode empfangen werden. Da es verhindert, dass die Anwendung die Adresse der Quelle der eingehenden Daten abruft, wird sie normalerweise mit verknüpften Sockeln verwendet. Die Puffer der Datei werden bis zum Ende der Datei empfangen. Die Daten werden dann entschlüsselt. Danach haben wir einen Treibercode. In der Hauptfunktion haben wir die Raketenmethode verbinden und die Datei empfangen.

Dies sind die folgenden Aussagen, die beim Empfang der Dateien gedruckt wurden. Wir können den Inhalt der Daten aus der angegebenen Datei im Client-Server lesen:

Abschluss

Um unseren Benutzern die Dinge zu erleichtern, überprüfte dieser Beitrag alle technischen Aspekte der Verwendung der Funktion c SendFile () in der Socket -Programmierung. Der Prozess kann durch die Verwendung der SendFile erheblich beschleunigt werden. Andere Maßnahmen wie die genaue Festlegung der Socket -Parameter müssen eingehalten werden, um sicherzustellen, dass die Netzwerkübertragung so effizient ist wie möglich ist. Um es möglich zu machen, haben wir versucht, die einfachen Beispiele aufzunehmen. Infolgedessen findet jeder, der C, der Hilfe bei der Funktion „sendFile ()“ benötigt, diese Daten nützlich findet.