Sendfile 2 C funzione

Sendfile 2 C funzione
SendFile () è una funzione che copia i dati tra i due descrittori di file. La funzione SendFile () è più efficace delle funzioni di lettura (2) e scrittura (2) perché copia i dati all'interno del kernel anziché inviare le informazioni da e verso l'archiviazione locale. Se si desidera inviare file a una connessione TCP utilizzando SendFile () ma deve trasmettere alcuni dati di intestazione prima dei file di dati, è possibile utilizzare l'opzione TCP Cork definita in TCP (7) per ridurre il numero di pacchetti e ottimizzare le prestazioni. Qui, utilizziamo la chiamata di sistema SendFile () di questo articolo. I file possono essere consegnati rapidamente utilizzando il protocollo UDP e un client/server di base. I file sono gestiti dalla crittografia di XOR.

Sintassi della funzione Sendfile in lingua C

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

Gli argomenti IN_FD, out_fd, off_t * e gli argomenti di conteggio size_t sono necessari affinché la funzione funzioni. I dettagli completi di questi argomenti sono i seguenti:

I descrittori di file "in fd" e "out fd" dovrebbero essere assegnati per la lettura e la scrittura, rispettivamente. Se il valore di offset non è nullo, si riferisce a una variabile che contiene l'offset del file da cui SendFile () inizierà a leggere i dati da in FD. Questa variabile verrà aggiornata ai byte dell'offset che arriva dopo l'ultimo byte letto quando sendfile () restituisce. SendFile () non modifica l'offset del file corrente di in FD se l'offset non è nullo; Altrimenti, l'offset del file corrente viene modificato per riflettere i byte letti in numero da "in FD". Il parametro di conteggio specifica quanti byte dovrebbero essere copiati tra i descrittori di file.

L'importo dei byte scritto su "FD" viene ripristinato se la comunicazione ha esito positivo. Vale la pena notare che una chiamata di successo a Sendfile () può comportare la scrittura di un minor numero di byte di quanto richiesto; Il chiamante deve essere disposto a riprovare l'operazione se ci sono byte non sente. Inoltre, se c'è un'eccezione, se -1 viene fornita e Errno è opportunamente impostata.

Errore della funzione SendFile () in lingua C

Eagin: Non bloccare la scrittura dovrebbe bloccare poiché I/O è configurato con O non blocco.

Ebadf: Non è possibile accedere al file di input o output per la lettura o la scrittura.

Efault: È stato inserito un indirizzo errato.

Einval: Il descrittore non è valido o bloccato o un'operazione simile a MMAP (2) per "in FD" non è accessibile.

Quando si legge da "In FD", EIO: Errore non specificato.

Enomem: Incapace di acquisire dal "in FD" a causa della mancanza di memoria.

Esempio 1: invia il file dal lato server in lingua C in Ubuntu 20.04

Dimostriamo come inviare i file dal lato server che è accettato dal lato client nel seguente esempio utilizzando la chiamata di sistema Sendfile:






Non entreremo nei dettagli su questo codice perché siamo interessati solo alla chiamata del sistema di funzione SendFile del linguaggio C che viene utilizzato per trasferire un file sul nostro codice lato client. Qui, abbiamo incluso tutti i file di intestazione applicabili nella sezione di intestazione e definito alcune direttive macro. Quindi, dopo questo, abbiamo creato una funzione per cancellare il buffer e una funzione di funzione per la crittografia. Quindi arriva alla funzione INT SENDFILE per inviare il file.

Il costruttore viene dichiarato per la funzione Sendfile in cui il file e il buffer sono definiti. Viene eseguito l'algoritmo per l'invio dei file al lato client. Innanzitutto, il nome file viene inviato al server. Se il file è presente, il server inizia a leggerlo e continua a inviare un buffer pieno di dati. Fino alla fine del file, il contenuto viene crittografato.

Quindi, abbiamo il codice del driver della funzione principale. All'interno della sezione Funzione principale, abbiamo definito le variabili e le variabili strutturali richieste. La funzione Send_File () invia i dati dal file associato al maniglia del file aperto tramite la connessione associata al socket.

Abbiamo utilizzato la funzione socket e abbiamo passato i parametri applicabili ad essa. Abbiamo eseguito la condizione IF-ELSE nella variabile del metodo socket, "Sockfd". Se il "Sockfd" è inferiore al valore 0, viene chiamata printf e stampa l'istruzione del descrittore di file che non viene ricevuto. Altrimenti, la compilation viene terminata visualizzando l'istruzione else. Abbiamo nuovamente usato la condizione IF-ELSE in cui il metodo di bind è invocato per scopi di abbuffata. Il metodo BIND contiene i parametri richiesti. Se l'operazione del metodo di bind è uguale al valore zero, viene stampato "vincolato correttamente". Se non riesce a raggiungere la condizione, l'istruzione "vincolante non riuscita" viene visualizzata nella schermata prompt.

Il ciclo while viene distribuito per ricevere il nome del file. Durante la ricezione del nome del file, viene visualizzata l'istruzione "in attesa del nome del file". Successivamente, il nome del file viene ricevuto da clear_buf (). Attraverso il "Fopen", leggiamo il file e stampiamo il messaggio "Nome file ricevuto" insieme al nome del file. Se il file è nullo, viene stampato l'istruzione "File aperta non riuscita". Altrimenti, viene eseguito il "file aperto correttamente". All'interno del nostro prossimo loop, abbiamo eseguito il processo SendFile e inviato il file con la chiamata di sistema SendTo. Alla fine, il file è chiuso.

Dopo la compilazione del codice, abbiamo inviato correttamente il file al server client dalla chiamata di sistema Sendfile.

Esempio 2: Invia un file dal lato client in lingua C in Ubuntu 20.04
Come abbiamo visto nell'istanza precedente, abbiamo inviato correttamente il file al codice del server. In questo caso, riceviamo i dati dal file inviati dal server.




Vieni al metodo "recvfile" in cui riceviamo il file applicando l'algoritmo specificato. Un segnale dalla modalità di connessione di un socket o dalla modalità senza connessione deve essere ricevuto con il metodo recvfile (). Poiché impedisce all'applicazione di recuperare l'indirizzo dell'origine dei dati in arrivo, di solito viene utilizzato con prese collegate. I buffer del file vengono ricevuti fino alla fine del file. I dati vengono quindi decrittografati. Successivamente, abbiamo un codice del driver. All'interno della funzione principale, abbiamo operato per collegare il metodo del razzo e abbiamo ricevuto il file.

Queste sono le seguenti affermazioni stampate al momento della ricezione dei file. Possiamo leggere il contenuto dei dati dal file specificato all'interno del server client:

Conclusione

Per rendere le cose più facili per i nostri utenti, questo post ha esaminato tutti gli aspetti tecnici dell'utilizzo della funzione C SendFile () nella programmazione socket. Il processo può essere considerevolmente accelerato utilizzando SendFile. Altre misure come stabilire accuratamente i parametri della presa devono essere seguite per garantire che il trasferimento di rete sia efficiente quanto possibile. Per renderlo possibile, abbiamo cercato di includere gli esempi facili. Di conseguenza, chiunque utilizza C che ha bisogno di aiuto con la funzione "SendFile ()" troverà questi dati utili.