Dydaktyka:
FeedbackTo jest stara wersja strony!
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:
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.
O Qt [1] [2]
Wersje frameworku (Qt4 i Qt5), qtchooser
Qt dostarcza własny system budowania - program qmake
, co oczywiście nie przeszkadza korzystać z innych systemów budowania (np. CMake).
Do graficznego projektowania GUI dostarczany jest program designer
, generujący pliki w formacie XML. Następnie programem uic
są one konwertowane na kod w C++.
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).
Z historycznych przyczyn Qt korzysta z dodatkowego preprocesora moc
. Od Qt5 użycie moc
można pominąć, jeśli korzysta się z nowej składni funkcji connect
.
Zarówno uic
jak i moc
są wywoływane automatycznie przez system budowania.
Opis z podręcznika Qt: Network Programming with Qt
Ważniejsze klasy do obsługi socketów i podstawowe metody i sygnały:
QTcpServer
- klasa tworząca gniazdo nasłuchujące protokołu TCPnewConnection
nextPendingConnection
wykonuje accept
QTcpSocket
- klasa gniada TCP klienckiego (łączącego się pod podany adres)connected
i disconnected
readyRead
, określający że przyszły nowe dane do odbioru connectToHost
żąda połączenia pod podany adresQUdpSocket
- klasa obsługująca gniazda UDPQTcpSocket
readDatagram
writeDatagram
Qt jest modularny. Do włączenia modułu odpowiedzialnego za sieć należy:
QT += network
find_package(Qt5 COMPONENTS … Network …)
target_link_libraries(target … Qt5::Network …)
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
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
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.