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/what-is-qt/|[1]]] [[https://pl.wikipedia.org/wiki/Qt|[2]]] \\ <html><small></html>Wersje frameworku (Qt4 i Qt5), ''qtchooser''<html></small></html> 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+''''+. \\ 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.11/qtnetwork-programming.html|Network Programming with Qt]] 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'', opcjonalnie ustawia ''SO_REUSEADDR'' 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|error]]'' (( 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]]] )) * 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 podobne 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'' <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.1542627872.txt.gz
· ostatnio zmienione: 2018/11/19 12:44 przez
jkonczak
Narzędzia strony
Pokaż stronę
Poprzednie wersje
Odnośniki
Złóż / rozłóż wszystko
Do góry