Narzędzia użytkownika

Narzędzia witryny


Pasek boczny

sk2:qt

Obsługa sieci w API / językach wysokiego poziomu

BSD socket API jest interfejsem niskiego poziomu do obsługi sieci. Pozwala on korzystać z wszystkich możliwości oferowanych przez system operacyjny. Co za tym idzie, nie jest on szczególnie wygodny, a typowe programy używające BSD socket API będą zawierać identyczne ciągi wywołań funkcji, w większości z identycznymi argumentami.
Stąd w bibliotekach / językach wysokiego poziomu są dostępne uproszczone interfejsy do obsługi sieci, które opakowują wywołania z BSD socket API.

Typowo wysokopoziomowe interfejsy:

  • są obiektowe
  • posiadają osobne klasy do typowych zadań:
    • nawiązanie połączenia TCP do podanego adresu
    • stworzenie serwera TCP
    • użycie gniazda UDP
  • często są przygotowane do łatwego wykorzystania w pętli zdarzeń
  • często pojawiają się bardziej specjalizowane klasy, np. do komunikacji żądanie-odpowiedź (HTTP).

Takie podejście pozwala przygotować wygodne i łatwe do nauczenia interfejsy programistyczne do obsługi sieci. Trzeba jednak pamiętać że takie interfejsy są tworzone pod typowe zastosowania, co czasami ogranicza możliwości ich wykorzystania.

Qt

Wprowadzenie

O Qt

Qt to framework (zestaw bibliotek i narzędzi) dla języka C++. Duży nacisk w Qt jest położony na budowę aplikacji z graficznym interfejsem użytkownika i tworzenie wieloplatformowego kodu.
Strona produktu     Strona "O Qt" w wiki Qt     Polska Wikipedia o Qt

Narzędzia

Qt do wersji 5 jako podstawowego systemu budowania używa dostarczonego z Qt programu qmake. Dodatkowo Qt 5 wspiera oficjalnie CMake (nieoficjalnie Qt jest wspierane też przez inne systemy budowania).
Qt od wersji 6 jako podstawowego systemu budowania używa CMake (dokumentacja dla Qt) nie zaprzestając rozwoju qmake.

Do graficznego projektowania GUI opartego o widżety dostarczany jest program designer, generujący pliki w formacie XML. Następnie programem uic są one automatycznie konwertowane na kod w C++.
Qt dostarcza też silnik języka QML i biblioteki Qt Quick do budowy GUI w QML.
Ponadto assistant pozwala przeglądać dokumentację, linguist w łatwy sposób umożliwia tłumaczenie programu.
Częścią SDK do Qt jest też IDE qtcreator.

Pętla zdarzeń, sygnały i sloty

Typowe aplikacje w Qt wykorzystują pętlę zdarzeń. Obiekty mogą zażądać obsługi zdarzenia (zdarzenie w Qt nazywa się signal), a programista za pomocą funkcji connect określa jaka funkcja (nazywana w Qt slot) ma być wywoływana gdy wystąpi podane zdarzenie (signals and slots).
Qt korzysta z dodatkowego preprocesora moc. Od Qt5 użycie moc można pominąć, jeśli korzysta się z nowej składni funkcji connect i nie definiuje własnych sygnałów.
Zarówno uic jak i moc są wywoływane automatycznie przez system budowania qmake. W cmake trzeba włączyć opcje AUTOUIC i AUTOMOC.

Sieć w Qt

Opis z podręcznika Qt: Network Programming with Qt

W Qt funkcje sieciowe są nieblokujące (asynchroniczne).
Bufory nadawcze i odbiorcze w Qt są nieograniczone.

Ważniejsze klasy do obsługi socketów i podstawowe metody i sygnały:

Qt jest modularny. Do włączenia modułu odpowiedzialnego za sieć należy:

  • dla qmake dodać linię:
    QT += network
  • dla cmake dodać do linii szukające Qt komponent Network, a następnie dodać go do bibliotek łączonych:
    find_package(Qt6 COMPONENTS … Network …)
    target_link_libraries(target … Qt6::Network …)

    Dla Qt 5 trzeba zmienić oczywiście Qt6 na Qt5

Przykład konsolowego klienta TCP w Qt

Zadania

Zadanie 1. Korzystając z l6_z1_template.tar.xz stwórz program, który będzie działać jak graficzna wersja programu netcat. Kod zawiera komentarze z wyszczególnionymi krokami do zrobienia (TODO's).

IP multicast - przypomnienie

Pula adresów (224.0.0.0/4), w tym: lokalne dla łącza adresy (224.0.0.0/24), Organization-Local Scope (239.0.0.0/24)
Komputer chcąc odbierać wiadomości od grupy multicastowej musi wysłać odpowiednią wiadomość IGMP.
BSD Socket API pozwala dołączyć do grupy multicastowej na konkretnym sockecie, adresie i interfejsie, co powoduje wysłanie wspomnianej wiadomości.
IP multicast można używać w połączeniu z protokołem UDP, natomiast nie jest wspierany przez protokół TCP.
Użycie IP multicast w BSD socket API: multicast_example
Lista grup mcastowych do których jest zapisany komputer: ip maddr lub netstat -ng lub cat /proc/net/igmp

Użycie programu socat do testowania multicastu:

Zadanie 2. Korzystając z l6_z2_template.tar.xz stwórz program, który będzie wysyłać i odbierać wiadomości z wybranej grupy multicastowej. Kod zawiera komentarze z wyszczególnionymi krokami do zrobienia (TODO's).

Zadanie 3. Napisz serwer czatu (serwer, który każdą otrzymaną wiadomość przekaże wszystkim połączonym klientom) wykorzystując Qt.

2) Uwaga, w nowej składni connect wymagany jest wskaźnik na funkcję, a klasa QTcpSocket ma dwie funkcje error. W efekcie potrzebne jest wybranie funkcji przez rzutowanie na właściwy typ [1]
sk2/qt.txt · ostatnio zmienione: 2022/11/28 16:26 przez jkonczak