Fonction SendFile 2 C

Fonction SendFile 2 C
Le SendFile () est une fonction qui copie les données entre les deux descripteurs de fichiers. La fonction SendFile () est plus efficace que les fonctions de lecture (2) et d'écriture (2) car il copie les données dans le noyau plutôt que d'envoyer les informations vers et depuis le stockage local. Si vous souhaitez envoyer des fichiers à une connexion TCP à l'aide du SendFile () mais doit transmettre certaines données d'en-tête avant les fichiers de données, vous pouvez utiliser l'option TCP Cork définie dans TCP (7) pour réduire le nombre de paquets et régler les performances. Ici, nous utilisons l'appel système SendFile () de cet article. Les fichiers peuvent être livrés rapidement à l'aide du protocole UDP et d'un client / serveur de base. Les fichiers sont gérés par le cryptage de XOR.

Syntaxe de la fonction SendFile dans le langage C

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

Les arguments de comptage In_FD, OUT_FD, OFF_T * et le nombre de size_t sont requis pour que la fonction fonctionne. Les détails complets de ces arguments sont les suivants:

Les descripteurs de fichiers «dans FD» et «Out FD» doivent être attribués pour la lecture et l'écriture, respectivement. Si la valeur de décalage n'est pas nul, elle fait référence à une variable qui maintient le décalage du fichier que le SendFile () commencera à lire les données à partir de FD. Cette variable sera mise à jour aux octets du décalage qui surviennent après la lecture du dernier octet lorsque SendFile () revient. SendFile () ne modifie pas le décalage de fichier actuel de FD si le décalage n'est pas nul; Sinon, le décalage de fichier actuel est modifié pour refléter les octets lus en nombre de «In FD». Le paramètre de nombre spécifie le nombre d'octets qui doivent être copiés entre les descripteurs de fichiers.

Le montant des octets rédigé à «FD» est resté si la communication réussit. Il convient de noter qu'un appel réussi à SendFile () peut entraîner un moins d'octets écrits que requis; L'appelant doit être disposé à réessayer l'opération s'il y a des octets insensés. De plus, s'il y a une exception, si -1 est fourni, et Errno est convenablement défini.

Erreur de la fonction SendFile () dans le langage C

Eagain: Non bloquant l'écriture doit bloquer car les E / S sont configurées avec le O non-block.

EBADF: Le fichier d'entrée ou de sortie n'a pas pu être accessible pour la lecture ou l'écriture.

Efault: Une adresse incorrecte a été saisie.

Einval: Le descripteur est invalide ou verrouillé, soit une opération de type MMAP (2) pour «en FD» n'est pas accessible.

Lors de la lecture de «In FD», EIO: erreur non spécifiée.

Enomem: Impossible d'acquérir à partir du «In FD» en raison d'un manque de mémoire.

Exemple 1: Envoyez le fichier à partir du côté serveur en C en C dans Ubuntu 20.04

Nous démontrons comment envoyer les fichiers à partir du côté serveur qui est accepté par le côté client dans l'exemple suivant en utilisant l'appel SendFile System:






Nous n'entrerons pas dans les détails de ce code, car nous ne sommes intéressés que par l'appel du système de fonction SendFile du langage de programmation C qui est utilisé pour transférer un fichier vers notre code côté client. Ici, nous avons inclus tous les fichiers d'en-tête applicables dans la section d'en-tête et défini certaines directives de macros. Ensuite, après cela, nous avons créé une fonction pour effacer le tampon et un chiffre de fonction pour le chiffrement. Viennent ensuite à la fonction int sendFile pour envoyer le fichier.

Le constructeur est déclaré pour la fonction SendFile où le fichier et le tampon sont définis. L'algorithme pour l'envoi des fichiers au côté client est effectué. Tout d'abord, le nom de fichier est envoyé au serveur. Si le fichier est présent, le serveur commence à le lire et continue d'envoyer un tampon plein de données. Jusqu'à la fin du fichier, le contenu est chiffré.

Ensuite, nous avons le code du pilote de la fonction principale. À l'intérieur de la section de fonction principale, nous avons défini les variables et les variables structurelles qui sont nécessaires. La fonction Send_File () envoie les données du fichier associé à la poignée du fichier ouvert sur la connexion associée à la prise.

Nous avons utilisé la fonction de socket et y avons passé les paramètres applicables. Nous avons effectué la condition IF-Else à la variable de la méthode de socket, «sockfd». Si le «sockfd» est inférieur à la valeur 0, le printf est appelé et imprime l'instruction du descripteur de fichier qui n'est pas reçu. Sinon, la compilation est terminée en affichant l'instruction ELSE. Nous avons de nouveau utilisé la condition IF-Else où la méthode de liaison est invoquée à des fins de binging. La méthode de liaison contient les paramètres requis. Si l'opération de la méthode de liaison est égale à la valeur zéro, le «bindid a réussi» est imprimé. S'il ne parvient pas à atteindre la condition, l'instruction «Binding a échoué» s'affiche sur l'écran de l'invite.

La boucle while est déployée pour recevoir le nom du fichier. Lors de la réception du nom du fichier, l'instruction «en attente du nom du fichier» s'affiche. Après cela, le nom du fichier est reçu du clear_buf (). Grâce au «fopen», nous lisons le fichier et imprimons le message «Nom du fichier reçu» avec le nom du fichier. Si le fichier est nul, l'instruction «le fichier ouvert a échoué» est imprimé. Sinon, le «fichier ouvert avec succès» est exécuté. Dans notre Loop Next While, nous avons effectué le processus SendFile et envoyé le fichier avec l'appel Sendto System. En fin de compte, le fichier est fermé.

Après la compilation du code, nous avons envoyé le fichier avec succès au client client par l'appel SendFile System.

Exemple 2: Envoyez un fichier à partir du côté client dans le langage C dans Ubuntu 20.04
Comme nous l'avons vu dans l'instance précédente, nous avons réussi à envoyer le fichier au code du serveur. Dans ce cas, nous recevons les données du fichier envoyé par le serveur.




Venez simplement à la méthode «RecvFile» où nous recevons le fichier en appliquant l'algorithme spécifié. Un signal du mode de connexion d'une prise ou du mode sans connexion doit être reçu par la méthode recvfile (). Parce qu'il empêche l'application de récupérer l'adresse de la source des données entrantes, elle est généralement utilisée avec des prises liées. Les tampons du fichier sont reçus jusqu'à la fin du fichier reçus. Les données sont ensuite déchiffrées. Après cela, nous avons un code de pilote. À l'intérieur de la fonction principale, nous avons fonctionné pour connecter la méthode de la fusée et reçu le fichier.

Ce sont les déclarations suivantes imprimées lors de la réception des fichiers. Nous pouvons lire le contenu des données à partir du fichier spécifié à l'intérieur du client client:

Conclusion

Pour faciliter les choses pour nos utilisateurs, ce post a examiné tous les aspects techniques de l'utilisation de la fonction c sendFile () dans la programmation de socket. Le processus peut être considérablement accéléré en utilisant le SendFile. D'autres mesures telles que l'établissement avec précision des paramètres de socket doivent être suivies pour s'assurer que le transfert de réseau est aussi efficace que possible. Pour le rendre possible, nous avons essayé d'inclure les exemples faciles. En conséquence, toute personne utilisant C qui a besoin d'aide avec la fonction «sendFile ()» trouvera ces données utiles.