przejście do zawartości
Jan Kończak
Narzędzia użytkownika
Zaloguj
Narzędzia witryny
Narzędzia
Pokaż stronę
Poprzednie wersje
Odnośniki
Ostatnie zmiany
Menadżer multimediów
Indeks
Zaloguj
Ostatnie zmiany
Menadżer multimediów
Indeks
Jesteś tutaj:
start
»
sk2
»
qt
sk2:qt
Ta strona jest tylko do odczytu. Możesz wyświetlić źródła tej strony ale nie możesz ich zmienić.
======= 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 === [[https://www.qt.io/product|[1]]] [[https://pl.wikipedia.org/wiki/Qt|[2]]] === Narzędzia === Qt dostarcza własny system budowania - program ''[[http://doc.qt.io/qt-5/qmake-manual.html|qmake]]'', co oczywiście nie przeszkadza korzystać z innych systemów budowania (np. CMake). \\ Do graficznego projektowania GUI dostarczany jest program ''[[http://doc.qt.io/qt-5/qtdesigner-manual.html|designer]]'', generujący pliki w formacie XML. Następnie programem ''[[http://doc.qt.io/qt-5/uic.html|uic]]'' są one konwertowane na kod w C+''''+. \\ <html><small></html>Ponadto ''assistant'' pozwala przeglądać dokumentację, ''linguist'' w łatwy sposób umożliwia tłumaczenie programu, ''qtchooser'' pozwala wybierać między zainstalowanymi wersjami Qt. Częścią SDK do Qt jest też IDE ''qtcreator''.<html></small></html> === Pętla zdarzeń, sygnały i sloty === Typowe aplikacje w Qt wykorzystują [[http://doc.qt.io/qt-5/qapplication.html#exec|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 ([[http://doc.qt.io/qt-5/signalsandslots.html|signals and slots]]). \\ Z historycznych przyczyn Qt korzysta z dodatkowego preprocesora ''[[http://doc.qt.io/qt-5/why-moc.html|moc]]''. Od Qt5 użycie ''moc'' można pominąć, jeśli korzysta się z nowej składni funkcji ''connect''. \\ <html><small></html>Zarówno ''uic'' jak i ''moc'' są wywoływane automatycznie przez system budowania.<html></small></html> ===== Sieć w Qt ===== Opis z podręcznika Qt: [[https://doc.qt.io/qt-5/qtnetwork-programming.html|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: * ''[[http://doc.qt.io/qt-5/qtcpserver.html|QTcpServer]]'' - klasa tworząca gniazdo nasłuchujące protokołu TCP * klasa udostępnia sygnał (zdarzenie) ''[[http://doc.qt.io/qt-5/qtcpserver.html#newConnection|newConnection]]'' * metoda ''[[http://doc.qt.io/qt-5/qtcpserver.html#listen|listen]]'' wywołuje ''bind'', ustawia ''SO_REUSEADDR''((w uproszczeniu; szczegóły tutaj: https://doc.qt.io/qt-5/qabstractsocket.html#BindFlag-enum)) i wywołuje ''listen'' * metoda ''[[http://doc.qt.io/qt-5/qtcpserver.html#nextPendingConnection|nextPendingConnection]]'' wykonuje ''accept'' * ''[[http://doc.qt.io/qt-5/qtcpsocket.html|QTcpSocket]]'' - klasa gniada TCP klienckiego (łączącego się pod podany adres) * sygnały ''[[http://doc.qt.io/qt-5/qabstractsocket.html#signals|connected]]'' i ''[[http://doc.qt.io/qt-5/qabstractsocket.html#signals|disconnected]]'' * sygnał ''[[http://doc.qt.io/qt-5/qabstractsocket.html#signals|errorOccured]]'' (Qt w wersji ≥5.15) \\ <html><small></html> sygnał ''[[http://doc.qt.io/qt-5.14/qabstractsocket.html#signals|error]]'' (Qt w wersji przed 5.15)(( 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 [[https://wiki.qt.io/New_Signal_Slot_Syntax#Asynchronous_made_easier|[1]]] ))<html></small></html> * sygnał ''[[http://doc.qt.io/qt-5/qiodevice.html#signals|readyRead]]'', określający że przyszły nowe dane do odbioru * metoda ''[[http://doc.qt.io/qt-5/qabstractsocket.html#connectToHost|connectToHost]]'' żąda połączenia pod podany adres * metoda ''[[http://doc.qt.io/qt-5/qiodevice.html#write|write]]'' pisze dane, natomiast ''[[http://doc.qt.io/qt-5/qiodevice.html#read|read]]'' i ''[[http://doc.qt.io/qt-5/qiodevice.html#readAll|readAll]]'' odbierają dane * ''[[http://doc.qt.io/qt-5/qudpsocket.html|QUdpSocket]]'' - klasa obsługująca gniazda UDP * sygnały identyczne jak dla ''QTcpSocket'' * odbiór wiadomości metodą ''[[http://doc.qt.io/qt-5/qudpsocket.html#readDatagram|readDatagram]]'' * wysłanie wiadomości metodą ''[[http://doc.qt.io/qt-5/qudpsocket.html#writeDatagram|writeDatagram]]'' 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(Qt5 COMPONENTS … Network …) \\ target_link_libraries(target … Qt5::Network …)'' ===== Zadania ===== //Zadanie 1.// Korzystając z {{:sk2: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 === [[http://www.iana.org/assignments/multicast-addresses/multicast-addresses.xhtml|Pula adresów]] (224.0.0.0/4), w tym: lokalne dla łącza adresy (224.0.0.0/24), [[https://tools.ietf.org/html/rfc2365|Organization-Local Scope]] (239.0.0.0/24)\\ Komputer chcąc odbierać wiadomości od grupy multicastowej musi wysłać odpowiednią wiadomość IGMP. \\ IP multicast można używać w połączeniu z protokołem UDP, natomiast nie jest wspierany przez protokół TCP. \\ <html><small></html> Użycie IP multicast w BSD socket API: [[sk2: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: | <code bash>socat UDP-DATAGRAM:239.0.0.1:2000,reuseaddr,bind=0.0.0.0:2000,ip-add-membership=239.0.0.1:tap0 STDIO # UDP-DATAGRAM:239.0.0.1:2000 → wysyłaj datagramy do podanego adresu (239.0.0.1:2000) i odbieraj co przyjdzie # reuseaddr → włącze SO_REUSEADDR; pozwala wielu programom na tym samym komputerze używać tego samego portu do mcastu # bind=0.0.0.0:2000 → wykonaj bind na podany adres; pod tym adresem będą odbierane datagramy # ip-add-membership=239.0.0.1:tap0 → dołącza do grupy mcastowej 239.0.0.1 na urządzeniu tap0</code> ++++ <html></small></html> //Zadanie 2.// Korzystając z {{:sk2: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). <html><small></html> //Zadanie 3.// Napisz serwer czatu (serwer, który każdą otrzymaną wiadomość przekaże wszystkim połączonym klientom) wykorzystując Qt. <html></small></html>
sk2/qt.1605547261.txt.gz
· ostatnio zmienione: 2020/11/16 18:21 (edycja zewnętrzna)
Narzędzia strony
Pokaż stronę
Poprzednie wersje
Odnośniki
Złóż / rozłóż wszystko
Do góry