Funkcja Sendfile 2 C

Funkcja Sendfile 2 C
SendFile () to funkcja, która kopiuje dane między dwoma deskryptorami plików. Funkcja sendFile () jest bardziej skuteczna niż funkcje odczytu (2) i zapisu (2), ponieważ kopiuje dane w jądrze, a nie wysyła informacji do i z lokalnej pamięci. Jeśli chcesz wysłać pliki do połączenia TCP za pomocą sendFile (), ale musisz przesyłać niektóre dane nagłówka przed plikami danych, możesz użyć opcji TCP Cork zdefiniowanej w TCP (7), aby zmniejszyć liczbę pakietów i dostroić wydajność. Tutaj korzystamy z połączenia systemowego tego artykułu (). Pliki mogą być dostarczane szybko za pomocą protokołu UDP i podstawowego klienta/serwera. Pliki są obsługiwane przez szyfrowanie XOR.

Składnia funkcji sendfile w języku C

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

In_fd, out_fd, off_t * i argumenty liczby size_t są wymagane, aby funkcja działała. Pełne szczegóły tych argumentów są następujące:

Deskryptory plików „w FD” i „Out FD” powinny być odpowiednio przypisane do czytania i pisania. Jeśli wartość przesunięcia nie jest zerowa, odnosi się do zmiennej, która utrzymuje przesunięcie pliku, z której sendFile () zacznie odczytać dane w FD. Ta zmienna zostanie zaktualizowana do bajtów przesunięcia, które pojawia się po ostatnim odczytaniu bajtów, gdy sendFile () zwraca. SendFile () nie zmienia bieżącego przesunięcia pliku w FD, jeśli przesunięcie nie jest null; W przeciwnym razie bieżące przesunięcie pliku jest modyfikowane w celu odzwierciedlenia bajtów odczytanych w liczbie z „w FD”. Parametr liczby określa, ile bajtów należy skopiować między deskryptorami plików.

Kwota bajtów napisana w „FD” jest powracana, jeśli komunikacja się powiedzie. Warto zauważyć, że udane wezwanie do SendFile () może spowodować, że mniej pisarzy jest napisane niż wymagane; Dzwoniący musi być skłonny ponowić ponowne operacje, jeśli są jakieś nieznaczne bajty. Ponadto, jeśli istnieje wyjątek, jeśli podano -1, a errno jest odpowiednio ustawione.

Błąd funkcji sendFile () w języku c

Eagain: Nie blokowanie zapisu powinno blokować, ponieważ we/wy jest skonfigurowane z O Nonblock.

Ebadf: Nie można uzyskać dostępu do pliku wejściowego lub wyjściowego do odczytu lub pisania.

Efault: Wprowadzono nieprawidłowy adres.

Einval: Deskryptor jest albo nieprawidłowy lub zablokowany, albo operacja podobna do MMAP (2) dla „w FD” nie jest dostępna.

Czytając z „In FD”, EIO: nieokreślony błąd.

Enomem: Nie można uzyskać z „w FD” z powodu braku pamięci.

Przykład 1: Wyślij plik z serwera w języku C w Ubuntu 20.04

Pokazujemy, jak wysłać pliki z serwera, które są akceptowane przez stronę klienta w poniższym przykładzie za pomocą wywołania systemu Sendfile:






Nie przejdziemy do szczegółów na temat tego kodu, ponieważ interesuje nas tylko połączenie systemu funkcji Sendfile Jange Programming, które służy do przesyłania pliku do naszego kodu po stronie klienta. Tutaj dołączyliśmy wszystkie odpowiednie pliki nagłówka w sekcji nagłówka i zdefiniowaliśmy niektóre dyrektywy makr. Następnie stworzyliśmy funkcję w celu wyczyszczenia bufora i szyfru funkcji dla szyfrowania. Następnie przychodzi do funkcji Int Sendfile, aby wysłać plik.

Konstruktor jest zadeklarowany dla funkcji sendfile, w której plik i bufor są zdefiniowane. Wykonany jest algorytm wysyłania plików na stronę klienta. Po pierwsze, nazwa pliku jest wysyłana na serwer. Jeśli plik jest obecny, serwer zaczyna go odczytać i wciąż wysyła bufor pełen danych. Do końca pliku zawartość jest szyfrowana.

Następnie mamy kod sterownika głównej funkcji. W głównej sekcji funkcji zdefiniowaliśmy zmienne i zmienne strukturalne, które są wymagane. Funkcja send_file () wysyła dane z pliku powiązanego z uchwytem otwartego pliku przez połączenie powiązane z gniazdem.

Wykorzystaliśmy funkcję gniazda i przekazaliśmy do niej odpowiednie parametry. Wykonaliśmy warunek IF-ELSE do zmiennej metody gniazda, „sockfd”. Jeśli „sockfd” jest mniejszy niż wartość 0, printf jest wywoływany i drukuje instrukcję deskryptora pliku, który nie jest odbierany. W przeciwnym razie kompilacja została zakończona przez wyświetlanie instrukcji ELEY. Ponownie użyliśmy warunku IF-ELSE, w którym wywoływana jest metoda wiązania do celów Binging. Metoda wiązania zawiera wymagane parametry. Jeśli operacja metody wiązania jest równa wartości zerowej, wydrukowane jest „Baked”. Jeśli nie osiągnie warunku, instrukcja „powiązanie powiązania” jest wyświetlane na ekranie podpowiedzi.

While pętla jest wdrażana do odbierania nazwy pliku. Podczas odbierania nazwy pliku wyświetlany jest instrukcja „Oczekiwanie na nazwę pliku”. Następnie nazwa pliku jest odbierana z Clear_Buf (). Za pośrednictwem „fopen” czytamy plik i drukujemy wiadomość „Otrzymana nazwa pliku” wraz z nazwą pliku. Jeśli plik jest zerowy, wydrukowana jest instrukcja „otwarty plik”. W przeciwnym razie wykonywane jest „plik otwarty”. W następnej pętli wykonaliśmy proces sendfile i wysłaliśmy plik z połączeniem systemowym SendTo. W końcu plik jest zamknięty.

Po kompilacji kodu z powodzeniem wysłaliśmy plik do obsługi klienta przez połączenie systemowe Sendfile.

Przykład 2: Wyślij plik z klienta w języku C w Ubuntu 20.04
Jak widzieliśmy w poprzedniej instancji, z powodzeniem wysłaliśmy plik do kodu serwera. W tym przypadku otrzymujemy dane z pliku wysyłanego przez serwer.




Po prostu przejdź do metody „recvfile”, w której otrzymujemy plik, stosując określony algorytm. Sygnał z trybu połączenia gniazda lub trybu bez połączenia musi być odbierany metodą recvfile (). Ponieważ zapobiega odzyskaniu aplikacji adresu źródła przychodzących danych, zwykle jest używany z połączonymi gniazdami. Bufory pliku są odbierane do końca pliku. Dane są następnie odszyfrowane. Następnie mamy kod sterownika. Wewnątrz głównej funkcji działaliśmy w celu podłączenia metody rakiety i otrzymaliśmy plik.

Są to następujące stwierdzenia wydrukowane po otrzymaniu plików. Możemy odczytać zawartość danych z określonego pliku w serwerze klienta:

Wniosek

Aby ułatwić naszym użytkownikom, w tym poście dokonano przeglądu wszystkich technicznych aspektów korzystania z funkcji C sendFile () w programowaniu gniazda. Proces można znacznie przyspieszyć, korzystając z pliku send. Należy zastosować inne pomiary, takie jak dokładne ustalenie parametrów gniazda, aby upewnić się, że transfer sieci jest tak wydajny, jak wykonalny. Aby to było możliwe, staraliśmy się podać łatwe przykłady. W rezultacie każdy, kto korzysta z C, który potrzebuje pomocy z funkcją „sendFile ()”, uzna te dane przydatne.