SendFile 2 C -funksjon

SendFile 2 C -funksjon
SendFile () er en funksjon som kopierer dataene mellom de to filbeskrivelsene. SendFile () -funksjonen er mer effektiv enn lesen (2) og skriver (2) funksjoner fordi den kopierer dataene i kjernen i stedet for å sende informasjonen til og fra den lokale lagringen. Hvis du vil sende filer til en TCP -tilkobling ved hjelp av SendFile (), men må overføre noen overskriftsdata før datafilene, kan du bruke TCP Cork -alternativet definert i TCP (7) for å redusere antall pakker og innstille ytelsen. Her bruker vi denne artikkelen SendFile () Systemanrop. Filer kan leveres raskt ved hjelp av UDP -protokollen og en grunnleggende klient/server. Filene håndteres ved kryptering av XOR.

Syntaks av sendfilfunksjonen på C -språk

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

In_fd, out_fd, off_t * offset og størrelse_t tellingsargumenter er nødvendig for at funksjonen skal fungere. De komplette detaljene i disse argumentene er som følger:

Filbeskrivelsene “i FD” og “Out FD” bør tilordnes henholdsvis lesing og skriving. Hvis forskyvningsverdien ikke er null, refererer den til en variabel som holder filforskyvningen som sendfilen () vil begynne å lese dataene fra i FD. Denne variabelen vil bli oppdatert til byte av forskyvningen som kommer etter den siste byten som leses når SendFile () kommer tilbake. SendFile () endrer ikke den gjeldende filforskyvningen av i FD hvis forskyvningen ikke er null; Ellers endres den gjeldende filforskyvningen for å gjenspeile byte som leses i antall fra "In FD". Telleparameteren spesifiserer hvor mange byte som skal kopieres mellom filbeskrivelsene.

Byte -beløpet som er skrevet til “FD” blir tilbakeført hvis kommunikasjonen er vellykket. Det er verdt å merke seg at en vellykket samtale til SendFile () kan føre til at det er skrevet noen færre byte enn nødvendig; Den som ringer må være villig til å prøve på nytt hvis det er noen usent på byte. Hvis det er et unntak, hvis -1 er gitt, og errno er passende satt.

Feil i SendFile () -funksjonen på C -språk

Eagain: Ikke -blokkering av skrivingen skal blokkere siden I/O er konfigurert med O -ikke -blokken.

Ebadf: Enten kan ikke inngangs- eller utgangsfilen nås for lesing eller skriving.

Efault: En feil adresse er lagt inn.

Einval: Beskrivelsen er enten ugyldig eller låst, eller en MMAP (2) -lignende operasjon for "i FD" er ikke tilgjengelig.

Når du leser fra “In FD”, EIO: Uspesifisert feil.

Enomem: Kan ikke skaffe seg "i FD" på grunn av mangel på minne.

Eksempel 1: Send filen fra serversiden på C-språket i Ubuntu 20.04

Vi demonstrerer hvordan du sender filene fra serversiden som er akseptert av klientsiden i følgende eksempel ved å bruke SendFile-systemanropet:






Vi vil ikke gå inn på detaljene om denne koden fordi vi bare er interessert i C-programmeringsspråkets SendFile-funksjonssystemanrop som brukes til å overføre en fil til vår klientsiden-kode. Her inkluderte vi alle gjeldende overskriftsfiler i overskriftsdelen og definerte noen makrosdirektiver. Deretter, etter dette, opprettet vi en funksjon for å tømme bufferen og en funksjonskiffer for krypteringen. Kommer så til int sendfile -funksjonen for å sende filen.

Konstruktøren er erklært for SendFile -funksjonen der filen og bufferen er definert. Algoritmen for å sende filene til klientsiden utføres. Først sendes filnavnet til serveren. Hvis filen er til stede, begynner serveren å lese den og fortsetter å sende en buffer full av data. Inntil slutten av filen er innholdet kryptert.

Deretter har vi driverkoden til hovedfunksjonen. Inne i hovedfunksjonsseksjonen definerte vi variablene og strukturelle variabler som er nødvendige. Send_File () -funksjonen sender dataene fra filen tilknyttet det åpne filhåndtaket over tilkoblingen tilknyttet kontakten.

Vi benyttet sokkelfunksjonen og passerte gjeldende parametere på den. Vi utførte IF-Else-tilstanden til socket-metodevariabelen, “SOCKFD”. Hvis "SOCKFD" er mindre enn verdien 0, kalles Printf og skriver ut uttalelsen fra filbeskrivelsen som ikke er mottatt. Ellers avsluttes samlingen ved å vise andre uttalelse. Vi brukte igjen IF-Else-tilstanden der bindingsmetoden påberopes for bingingformål. Bind -metoden inneholder de nødvendige parametrene. Hvis bindingsmetodeoperasjonen er lik nullverdien, skrives "bindet med suksess". Hvis den ikke klarer å oppnå tilstanden, vises uttalelsen "binding mislykket" på hurtigskjermen.

Mens sløyfen er distribuert for å motta filnavnet. Mens du mottar filnavnet, vises uttalelsen "Waiting For the File Name". Etter det mottas filnavnet fra Clear_Buf (). Gjennom "fopen" leste vi filen og skriver ut meldingen "Filnavn mottatt" sammen med filnavnet. Hvis filen er null, skrives uttalelsen “Filen åpnet mislyktes”. Ellers blir "filen som åpnes med suksess" utført. Innenfor vår neste mens Loop utførte vi SendFile -prosessen og sendte filen med SendTo -systemanropet. Til slutt er filen lukket.

Etter samlingen av koden sendte vi filen til klientserveren med SendFile System Call.

Eksempel 2: Send en fil fra klientsiden på C-språket i Ubuntu 20.04
Som vi har sett i foregående forekomst, sendte vi filen til serverkoden med hell til serverkoden. I dette tilfellet mottar vi dataene fra filen som er sendt av serveren.




Bare kom til "recvfile" -metoden der vi mottar filen ved å bruke den spesifiserte algoritmen. Et signal fra enten en sockets tilkoblingsmodus eller tilkoblingsfri modus må være mottatt ved RECVFile () -metoden. Fordi det forhindrer applikasjonen i å hente adressen til kilden til innkommende data, brukes den vanligvis med koblede stikkontakter. Bufferne av filen mottas til slutten av filen er mottatt. Dataene dekrypteres deretter. Etter det har vi en driverkode. Inne i hovedfunksjonen opererte vi for å koble rakettmetoden og mottok filen.

Dette er følgende utsagn skrevet ut når du mottar filene. Vi kan lese innholdet i dataene fra den spesifiserte filen i klient-serveren:

Konklusjon

For å gjøre ting enklere for brukerne våre, gjennomgikk dette innlegget alle de tekniske aspektene ved å bruke C sendfile () -funksjonen i socket -programmeringen. Prosessen kan fremskyndes betydelig ved å bruke sendfilen. Andre tiltak som nøyaktig å etablere sokkelparametrene må følges for å sikre at nettverksoverføringen er like effektiv som mulig. For å gjøre det mulig prøvde vi å inkludere de enkle eksemplene. Som et resultat vil alle som bruker C som trenger hjelp med "sendfile ()" -funksjonen finne disse dataene nyttige.