Función SendFile 2 C

Función SendFile 2 C
SendFile () es una función que copia los datos entre los dos descriptores de archivos. La función sendFile () es más efectiva que las funciones de lectura (2) y escribir (2) porque copia los datos dentro del núcleo en lugar de enviar la información al almacenamiento local y desde el almacenamiento local. Si desea enviar archivos a una conexión TCP utilizando sendFile () pero necesita transmitir algunos datos de encabezado antes de los archivos de datos, puede usar la opción TCP Cork definida en TCP (7) para reducir la cantidad de paquetes y ajustar el rendimiento. Aquí, usamos la llamada del sistema sendFile () de este artículo. Los archivos se pueden entregar rápidamente utilizando el protocolo UDP y un cliente/servidor básico. Los archivos se manejan por cifrado de XOR.

Sintaxis de la función SendFile en lenguaje C

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

El in_fd, out_fd, off_t * offset y los argumentos de recuento size_t son necesarios para que funcione la función. Los detalles completos de estos argumentos son los siguientes:

Los descriptores de archivo "en FD" y "Out FD" deben asignarse para leer y escribir, respectivamente. Si el valor de desplazamiento no es nulo, se refiere a una variable que contiene la compensación del archivo que sendFile () comenzará a leer los datos de FD. Esta variable se actualizará a los bytes del desplazamiento que viene después del último byte leído cuando SendFile () regresa. SendFile () no cambia la compensación de archivo actual de en FD si el desplazamiento no es nulo; De lo contrario, el desplazamiento del archivo actual se modifica para reflejar los bytes leídos en número de "En FD". El parámetro de recuento especifica cuántos bytes se deben copiar entre los descriptores de archivo.

La cantidad de bytes escrito a "FD" se rechaza si la comunicación es exitosa. Vale la pena señalar que una llamada exitosa a SendFile () puede resultar en que se escriban un menos bytes de lo requerido; la persona que llama debe estar dispuesta a volver a intentar la operación si hay bytes no intentos. Además, si hay una excepción, si se proporciona -1, y ERRNO se establece adecuadamente.

Error de la función sendFile () en el lenguaje C

EAGAIN: No bloquear la escritura debe bloquear ya que la E/S está configurada con el O Non -Blok.

Ebadf: No se pudo acceder al archivo de entrada o salida para leer o escribir.

Efault: Se ha ingresado una dirección incorrecta.

Einval: El descriptor es inválido o bloqueado, o una operación similar a MMAP (2) para "en FD" no es accesible.

Al leer "In FD", EIO: Error no especificado.

Enomem: Incapaz de adquirir del "en FD" debido a la falta de memoria.

Ejemplo 1: Envíe el archivo desde el lado del servidor en el idioma C en Ubuntu 20.04

Demostramos cómo enviar los archivos desde el lado del servidor que aceptan el lado del cliente en el siguiente ejemplo utilizando la llamada del sistema SendFile:






No entraremos en los detalles sobre este código porque solo estamos interesados ​​en la llamada del sistema de función SendFile del lenguaje de programación C que se utiliza para transferir un archivo a nuestro código del lado del cliente. Aquí, incluimos todos los archivos de encabezado aplicables en la sección del encabezado y definimos algunas directivas de Macros. Luego, después de esto, creamos una función para borrar el búfer y un cifrado de la función para el cifrado. Luego llega a la función int sendfile para enviar el archivo.

El constructor se declara para la función sendFile donde se definen el archivo y el búfer. Se realiza el algoritmo para enviar los archivos al lado del cliente. Primero, el nombre de archivo se envía al servidor. Si el archivo está presente, el servidor comienza a leerlo y sigue enviando un búfer lleno de datos. Hasta el final del archivo, el contenido está encriptado.

Luego, tenemos el código del controlador de la función principal. Dentro de la sección de la función principal, definimos las variables y las variables estructurales que se requieren. La función send_file () envía los datos del archivo asociado con el mango del archivo abierto a través de la conexión asociada con el socket.

Utilizamos la función de socket y le pasamos los parámetros aplicables. Realizamos la condición if-else a la variable del método de socket, "Sockfd". Si el "Sockfd" es menor que el valor 0, se llama al printf e imprime la declaración del descriptor de archivo que no se recibe. De lo contrario, la compilación se finaliza mostrando la instrucción delse. Nuevamente usamos la condición if-else donde se invoca el método de enlace con fines de atracción. El método de enlace contiene los parámetros requeridos. Si la operación del método de enlace es igual al valor cero, se imprime el "bidding con éxito". Si no logra alcanzar la condición, la declaración "Falling de enlace" se muestra en la pantalla de inmediato.

El bucle mientras se implementa para recibir el nombre del archivo. Al recibir el nombre del archivo, se muestra la declaración "Esperando el nombre del archivo". Después de eso, el nombre del archivo se recibe de Clear_Buf (). A través del "Fopen", leemos el archivo e imprimimos el mensaje "Nombre del archivo recibido" junto con el nombre del archivo. Si el archivo es nulo, se imprime la declaración "Fallado de archivo abierto". De lo contrario, se ejecuta el "archivo abierto con éxito". Dentro de nuestro siguiente bucle While, realizamos el proceso SendFile y enviamos el archivo con la llamada del sistema SendTO. Al final, el archivo está cerrado.

Después de la compilación del código, enviamos con éxito el archivo al cliente cliente por la llamada del sistema SendFile.

Ejemplo 2: Envíe un archivo desde el lado del cliente en el idioma C en Ubuntu 20.04
Como hemos visto en la instancia anterior, enviamos con éxito el archivo al código del servidor. En este caso, recibimos los datos del archivo enviado por el servidor.




Simplemente venga al método "RecvFile" donde recibimos el archivo aplicando el algoritmo especificado. El método RecvFile () debe recibir una señal del modo de conexión de un socket o el modo sin conexión. Debido a que evita que la aplicación recupere la dirección de la fuente de los datos entrantes, generalmente se usa con enchufes vinculados. Los buffers del archivo se reciben hasta que se recibe el final del archivo. Los datos se descifran luego. Después de eso, tenemos un código de controlador. Dentro de la función principal, operamos para conectar el método de cohete y recibimos el archivo.

Estas son las siguientes afirmaciones impresas al recibir los archivos. Podemos leer el contenido de los datos del archivo especificado dentro del servidor cliente:

Conclusión

Para facilitar las cosas para nuestros usuarios, esta publicación revisó todos los aspectos técnicos del uso de la función C sendFile () en la programación de socket. El proceso puede acelerarse considerablemente utilizando el sendfile. Se deben seguir otras medidas, como el establecimiento de los parámetros del zócalo para garantizar que la transferencia de red sea tan eficiente como sea factible. Para hacerlo posible, tratamos de incluir los ejemplos fáciles. Como resultado, cualquier persona que use C que necesite ayuda con la función "SendFile ()" encontrará estos datos útiles.