W przeszłości gniazda domeny Unix były albo niezidentyfikowane lub powiązane z nazwą systemu plików. W tym artykule omówimy użycie gniazda domeny Unix.
Zobaczmy przykład, w którym użyliśmy rodziny domeny gniazda AF_Unix do wykonywania komunikacji między klientem a serwerem. Możemy ponownie uruchomić wielu klientów na jednym serwerze, ale do celów demonstracyjnych po prostu używamy pojedynczego klienta podłączonego do serwera. W takim przypadku dwa różne procesy, jeden uruchomiony dla serwera i jeden uruchomiony dla klienta, komunikują się na tym samym komputerze, dla którego używane jest gniazdo domeny Unix. Utwórz plik za pomocą edytora vim i nazwij serwer IT1.c Ale możesz użyć Nano lub dowolnego innego edytora.
Wpisz kolejne wiersze kodu w pliku, gdy jest on otwarty w trybie Wstaw (Escape + I). Najpierw zdefiniuj zmienną nazwy gniazda, i.mi., Nazwa gniazda komunikacji. W katalogu tymczasowym dodaliśmy plik gniazda. Kolejne wiersze kodu pojawiają się przed główną funkcją, w tym niezbędne pliki nagłówka. Nazwa gniazda zmienna strukturalna typu sockaddr_un jest deklarowana. Utwórz cztery zmienne typu liczb całkowitych, które należy użyć później. Tworzenie gniazda serwera i komunikacji kanałowej zostało podzielone na następujące kroki:
1. Korzystając z wywołania systemowego Socket () i flagi AF UNIX, serwer tworzy gniazdo domeny UNIX. Przyszłe wywołania systemowe można wykonać za pomocą deskryptora pliku, który zwraca ta metoda. Zmienna gniazda połączenia, która jest deskryptorem pliku serwera, jest testowana w instrukcji warunkowej, aby sprawdzić, czy zawiera -1, co oznacza, że proces budowy gniazda nie powiódł się.
2. Następnie musimy użyć funkcji przenośnej memset, aby całkowicie wytrzeć pamięć. Po tym ustaw nazwisko gniazda na AF Unix.
3. Aby klient mógł się połączyć, serwer wiąże gniazdo z dobrze znanym adresem za pomocą wywołania systemu bind (), ale wcześniej skopiuj nazwę Socket_name do nazwy socket_name.Zmienna sun_path przy użyciu metody kopiowania ciągu (strcopy). Korzystając z wyniku powrotu w wyrażeniu warunkowym, ustalamy, czy wywołanie systemu wiązania zakończyło się powodzeniem.
4. System System () jest używany przez serwer do wyznaczenia gniazda jako pasywnego lub jako takiego, który zaakceptuje przychodzące żądania połączenia od klientów.
5. Klient wysyła poszczególne wiadomości dla każdego ze swoich danych wejściowych. Serwer oblicza sumę komunikatów przychodzących. Ciąg polecenia „END/ENTER” jest wysyłany przez klienta. Serwer odpowiada komunikatem zawierającym liczby całkowite klienta dodane razem. Po wydrukowaniu sumy wartości wejściowych w odpowiedzi przez serwer klient kończy. Tak szybko, jak nowy klient, serwer czeka za pomocą pętli. Parametr „w dół” może być używany do zakończenia serwera po wywołaniu klienta.
6. Słuchanie połączenia odbywa się w pierwszej pętli, podczas gdy operacje odczytu i zapisu są wywoływane w drugiej pętli. Podczas wysyłania wiadomości do klientów serwer stosuje wywołanie systemu pisania.
7. Następnie gniazdo rówieśnicze można dotrzeć za pomocą funkcji systemu Read () i zapisu () (i.mi., komunikować się między serwerem a klientem).
8. Wreszcie, serwer powinien wywołać metodę Close (), aby zamknąć połączenie po jej dostępie do gniazda.
Użyj polecenia wskazanego na zrzucie ekranu, aby skompilować kod w Linux za pomocą kompilatora GCC. To polecenie tworzy plik wyjściowy o nazwie serwera.
Oto kod pliku po stronie klienta w języku programowania C. Nazwa gniazda używana w pliku serwera jest również potrzebna do komunikacji. Utwórz gniazdo domeny UNIX po zaimportowaniu niezbędnych plików nagłówka, przy użyciu tego samego podejścia, co w pliku serwera. Kod odpoczynku jest podobny do klienta przy użyciu wywołania systemowego zapisu (), aby wysłać wejście do serwera. Parametry w głównym nagłówku funkcji są używane do odczytu wejść wiersza poleceń, a następnie piszemy je za pomocą pętli do przesyłania do serwera. Poczekaj na odpowiedź serwera za pomocą metody odczytu po udanej operacji zapisu. Metoda odczytu utrzymuje odpowiedź serwera w buforze, a następnie wyświetla ją na ekranie. Zamknij połączenie gniazda po tej komunikacji.
Sprawdźmy, w jaki sposób serwer i klient wchodzą w interakcje. Aby to zrobić, potrzebujemy dwóch terminali, w których musimy najpierw uruchomić plik wyjściowy serwera przed uruchomieniem klienta i wysłania wejść do serwera. Klient wychodzi po przeczytaniu i wyświetleniu odpowiedzi serwera.
W przypadku, gdy przyjęcie wiązania jest już używane, w tym przypadku użyj opcji SO_REUSEADDR.
Jeśli serwer jest offline, a klient chce się połączyć, wyjście byłoby jak poniżej.
Jeśli klient nie podaje żadnego numeru wejściowego:
Jeśli klient wprowadzi liczbę podczas komunikowania się z serwerem, serwer doda liczby i odpowiedzie na klienta, wyświetlając wynik.
Aby wyłączyć serwer na żądanie klienta
Wniosek
W tym artykule zademonstrowaliśmy użycie zarówno po stronie klienta, jak i po stronie serwera w celu wykorzystania gniazda domeny Unix. W tym celu wypróbowaliśmy prosty kod C dla obu stron w systemie operacyjnym Kali Linux. Mamy nadzieję, że uzyskasz dobrą pomoc z tego artykułu.