Narzędzia użytkownika

Narzędzia witryny


sk2:sockets_intro

Różnice

Różnice między wybraną wersją a wersją aktualną.

Odnośnik do tego porównania

Both sides previous revision Poprzednia wersja
Nowa wersja
Poprzednia wersja
sk2:sockets_intro [2022/10/01 10:15]
jkonczak [Hello world]
sk2:sockets_intro [2024/10/07 20:27] (aktualna)
jkonczak
Linia 1: Linia 1:
 ====== Wstęp – przypomnienia ====== ====== Wstęp – przypomnienia ======
 +
 +\\
  
 ==== C++ ==== ==== C++ ====
Linia 11: Linia 13:
 |''​c+////​+''​|domyślny kompilator C+////+. Zwykle link do ''​g+////​+''​ lub ''​clang+////​+''​| |''​c+////​+''​|domyślny kompilator C+////+. Zwykle link do ''​g+////​+''​ lub ''​clang+////​+''​|
 |''​c+////​+ zrodlo.cpp -o prog''​|kompiluje plik ''​zrodlo.cpp''​ do programu ''​prog''​| |''​c+////​+ zrodlo.cpp -o prog''​|kompiluje plik ''​zrodlo.cpp''​ do programu ''​prog''​|
-|''​c+////​+ -Wall       z.cpp -o p''​|włącza wszystkie ostrzeżenia kompilatora (''​-W''​ = warn, ''​all''​ = wszystkie)|+|''​c+////​+ -Wall       z.cpp -o p''​|włącza wszystkie(("​Wszystkie"​ oznacza wybrany zbiór ostrzeżeń o nazwie wszystkie, poza ''​-Wall''​ warto też dodać ''​-Wextra''​ i rozważyć dodanie ''​-pedantic''​. Szczegóły w dokumentacji kompilatora [[https://​gcc.gnu.org/​onlinedocs/​gcc/​Warning-Options.html|gcc]]/​[[https://​clang.llvm.org/​docs/​UsersManual.html#​enabling-all-diagnostics|clang]])) ​ostrzeżenia kompilatora (''​-W''​ = warn, ''​all''​ = wszystkie)|
 |''​c+////​+ -O0 -g      z.cpp -o p''​|wyłącza optymalizacje i dodaje do programu dane umożliwiające debugowanie| |''​c+////​+ -O0 -g      z.cpp -o p''​|wyłącza optymalizacje i dodaje do programu dane umożliwiające debugowanie|
 |''​c+////​+ --std=c+////​+20 z.cpp -o p''​|włącza używanie standardu ISO C+////+ z 2020 roku| |''​c+////​+ --std=c+////​+20 z.cpp -o p''​|włącza używanie standardu ISO C+////+ z 2020 roku|
Linia 33: Linia 35:
 Interface obsługi gniazd BSD jest bardzo zbliżony do API specyfikowanego przez POSIX do obsługi plików (który znacie z PSiW). \\ <​html><​small>​ BSD socket API został przyjęty jako standard przez większość systemów operacyjnych,​ m. inn. został bez większych zmian wpisany w standard POSIX.</​small></​html>​ Interface obsługi gniazd BSD jest bardzo zbliżony do API specyfikowanego przez POSIX do obsługi plików (który znacie z PSiW). \\ <​html><​small>​ BSD socket API został przyjęty jako standard przez większość systemów operacyjnych,​ m. inn. został bez większych zmian wpisany w standard POSIX.</​small></​html>​
  
-//Zadanie ​1.// Napisz program który otworzy plik o nazwie '​date'​ i wypisze jego zawartość. Poniżej "​pusty"​ plik źródłowy. Pomiń obsługę błędów. (Jeśli nie wiesz skąd wziąć plik ''​date'',​ wpisz w konsolę: ''​date>​date''​ .) \\ Do obsługi pliku i standardowego wejścia / wyjścia użyj funkcji ''​open'',​ ''​read'',​ ''​write''​ i ''​close''​. \\+~~Zadanie.#~~ Napisz program który otworzy plik o nazwie '​date'​ i wypisze jego zawartość. Poniżej "​pusty"​ plik źródłowy. Pomiń obsługę błędów. (Jeśli nie wiesz skąd wziąć plik ''​date'',​ wpisz w konsolę: ''​date>​date''​ .) \\ Do obsługi pliku i standardowego wejścia / wyjścia użyj funkcji ''​open'',​ ''​read'',​ ''​write''​ i ''​close''​. \\
 Opis funkcji znajdziesz na stronach podręcznika systemowego (np. ''​man open''​). Opis funkcji znajdziesz na stronach podręcznika systemowego (np. ''​man open''​).
 <file cpp z1.cpp> <file cpp z1.cpp>
Linia 45: Linia 47:
 </​file>​ </​file>​
  
-//Zadanie ​2.// Co trzeba dodać do obsłużenia błędów?+~~Zadanie.#~~ Co trzeba dodać do obsłużenia błędów?
  
 ==== Adresacja połączeń na warstwie transportu ==== ==== Adresacja połączeń na warstwie transportu ====
  
-//Zadanie ​3.// Jakie adresy (numery) są potrzebne by móc przesłać wiadomość do konkretnego programu na wybranym komputerze?+~~Zadanie.#~~ Jakie adresy (numery) są potrzebne by móc przesłać wiadomość do konkretnego programu na wybranym komputerze?
  
 Przypomnienie programów ''​netcat''​ / ''​socat''​ oraz programów ''​netstat''​ / ''​ss''​ ([[sk1:​transport#​monitorowanie_biezacych_polaczen|link do materiałów z SK1]]) Przypomnienie programów ''​netcat''​ / ''​socat''​ oraz programów ''​netstat''​ / ''​ss''​ ([[sk1:​transport#​monitorowanie_biezacych_polaczen|link do materiałów z SK1]])
  
-//Zadanie ​4.// Prześlij między sobą dowolny tekst używając programu ''​netcat''​ lub ''​socat''​+~~Zadanie.#~~ Prześlij między sobą dowolny tekst używając programu ''​netcat''​ lub ''​socat''​
  
-//Zadanie ​5.// Nawiąż połączenie na port 13 (daytime) twojego komputera.+~~Zadanie.#~~ Nawiąż połączenie na port 13 (daytime) twojego komputera. ​\\  
 +<​html><​small></​html>​Jeżeli używasz własnego komputera i port 13 nie odpowiada, uruchom i pozostaw działającą w osobnym terminalu komendę \\ ''​socat tcp-listen:​1313,​fork,​reuseaddr exec:​date''​   i do tego oraz dalszych ćwiczeń używaj port 1313.<​html></​small></​html>​
  
 <​html><​small></​html>​Więcej informacji o "​useful debugging and measurement tools":​ <​html><​small></​html>​Więcej informacji o "​useful debugging and measurement tools":​
Linia 81: Linia 84:
 Przykład wysłania liczby 0x010F, czyli 271, czyli 0b0000000100001111 Przykład wysłania liczby 0x010F, czyli 271, czyli 0b0000000100001111
 |byte order\bit order|MSB first|LSB first| | | |byte order\bit order|MSB first|LSB first| | |
-|little endian|0000111100000001|1111000010000000| x86 |<​html><​div style="​margin-top:​1em">​ARM,​ IA-64 (Itanium), SPARC≥v9</​div></​html>​|+|little endian|0000111100000001|1111000010000000| x86/​x86_64 ​|<​html><​div style="​margin-top:​1em">​ARM,​ IA-64 (Itanium), SPARC≥v9, RISC-V</​div></​html>​|
 |big endian|0000000100001111|1000000011110000|Motorola 68k, SPARC<​v9,​ z/Arch| :::| |big endian|0000000100001111|1000000011110000|Motorola 68k, SPARC<​v9,​ z/Arch| :::|
 | |  I²C, SDH  |  Ethernet, RS232, USB  | | | |  I²C, SDH  |  Ethernet, RS232, USB  | |
Linia 95: Linia 98:
 uint16_t networkEndianessPort = htons(hostEndianessPort);​ uint16_t networkEndianessPort = htons(hostEndianessPort);​
 </​code>​ </​code>​
-Opis funkcji pomocniczych[[http://​www.cs.put.poznan.pl/​ddwornikowski/​sieci/​sieci2/​bsdsockets.html#​funkcje-pomocnicze]]+Opis funkcji pomocniczych ​– patrz ''​man byteorder''​ lub [[http://​www.cs.put.poznan.pl/​ddwornikowski/​sieci/​sieci2/​bsdsockets.html#​funkcje-pomocnicze|strona Darka Dwornikowskiego]]
  
 ==== Zapis adresu gniazda ==== ==== Zapis adresu gniazda ====
Linia 105: Linia 108:
 Ta struktura nie pozwala na bezpośrednie wykorzystanie. Zamiast tego dla IPv4 należy używać **''​sockaddr_in''​** (w C – ''​struct sockaddr_in''​) Ta struktura nie pozwala na bezpośrednie wykorzystanie. Zamiast tego dla IPv4 należy używać **''​sockaddr_in''​** (w C – ''​struct sockaddr_in''​)
  
-Opis struktury''​man 7 ip'' ​lub ''​man netinet_in.h''​ lub  +Opis struktury ​– patrz ''​man 7 ip'' ​''​man netinet_in.h''​ lub  
-[[http://​www.cs.put.poznan.pl/​ddwornikowski/​sieci/​sieci2/​bsdsockets.html#​glowne-funkcje-interfejsu-gniazd]]+[[http://​www.cs.put.poznan.pl/​ddwornikowski/​sieci/​sieci2/​bsdsockets.html#​glowne-funkcje-interfejsu-gniazd|strona Darka]]
  
 <​html><​small></​html>​ <​html><​small></​html>​
Linia 117: Linia 120:
 ==== "Hello world" ==== ==== "Hello world" ====
  
-//Zadanie ​6.// Zmień program do odczytu pliku tak, by zamiast funkcji ''​open(…)'':​+~~Zadanie.#~~ Zmień program do odczytu pliku tak, by zamiast funkcji ''​open(…)'':​
   * tworzył funkcją ''​socket(…)''​ gniazdo:   * tworzył funkcją ''​socket(…)''​ gniazdo:
     * domeny komunikacyjnej protokołu IPv4 – stała ''​PF_INET''​ (zamiennie ''​AF_INET''​) ​     * domeny komunikacyjnej protokołu IPv4 – stała ''​PF_INET''​ (zamiennie ''​AF_INET''​) ​
Linia 125: Linia 128:
     * rodzina adresów IPv4 – stała ''​AF_INET''​     * rodzina adresów IPv4 – stała ''​AF_INET''​
     * port – 13 (port usługi daytime; pamiętaj o porządku bajtów - ''​htons''​)     * port – 13 (port usługi daytime; pamiętaj o porządku bajtów - ''​htons''​)
-    * adres IP – 127.0.0.1 (localhost, do konwersji użyj ''​inet_addr''​ lub ''​inet_aton''​);​ \\ można też ustawić adres na stałą ''​htonl(INADDR_LOOPBACK)''​. \\  <​html><​small></​html>​ Uwaga: ''​.sin_addr''​ to struktura typu ''​in_addr''​ z jedną składową ''​.s_addr''​ typu ''​uint32_t''​ \\ ''​inet_addr''​ przyjmuje wskaźnik na strukturę, natomiast ''​inet_aton''​ zwraca liczbę którą trzeba przypisać składowej ''​.s_addr'':​ \\ <code cpp>​sockaddr_in nazwa_zmiennej;​+    * adres IP – 127.0.0.1 (localhost, do konwersji użyj ''​inet_addr''​ lub ''​inet_aton''​);​ \\ można też ustawić adres na stałą ''​htonl(INADDR_LOOPBACK)''​. \\  <​html><​small></​html>​ Uwaga: ''​.sin_addr''​ to struktura typu ''​in_addr''​ z jedną składową ''​.s_addr''​ typu ''​uint32_t''​ \\ ''​inet_aton''​ przyjmuje wskaźnik na strukturę, natomiast ''​inet_addr''​ zwraca liczbę którą trzeba przypisać składowej ''​.s_addr'':​ \\ <code cpp>​sockaddr_in nazwa_zmiennej;​
 wersja 1: nazwa_zmiennej.sin_addr.s_addr = inet_addr("​8.8.8.8"​);​ wersja 1: nazwa_zmiennej.sin_addr.s_addr = inet_addr("​8.8.8.8"​);​
 wersja 2: inet_aton("​8.8.8.8",​ &​nazwa_zmiennej.sin_addr);​ wersja 2: inet_aton("​8.8.8.8",​ &​nazwa_zmiennej.sin_addr);​
Linia 141: Linia 144:
 </​code>​ </​code>​
  
-//Zadanie ​7.// Przekształć poprzedni program tak, by czytał z adresu IP i portu podanego w argumentach programu.+~~Zadanie.#~~ Przekształć poprzedni program tak, by czytał z adresu IP i portu podanego w argumentach programu.
  
-//Zadanie ​8.// Dodaj do programu obsługę błędów zwracanych przez funkcje ''​connect''​ i ''​read''​.+~~Zadanie.#~~ Dodaj do programu obsługę błędów zwracanych przez funkcje ''​connect''​ i ''​read''​.
  
 +~~Zadanie.#​~~ Zmień IP na losowe (tak, by nie odpowiadało na próbę połączenia). Programem ''​netstat -tnp''​ / ''​ss -tnp''​ wyświetl utworzone połączenie.
  
-//Zadanie 9.// Zmień IP na losowe (tak, by nie odpowiadało na próbę połączenia). Programem ''​netstat -tnp''​ / ''​ss -tnp''​ wyświetl utworzone połączenie.+==== Funkcje send/recv/… ====
  
-<​html>​<​small></​html> +Poza funkcją ''​read(…)''​ do odbierania danych można używać funkcji ''​recv'',​ 
-//Zadanie 10.// Zmień program takby zamiast ​''​read()''​ używał funkcji ''​recv()''​+<​small> ​''​recvfrom''​ i ''​recvmsg''​</small>, przy czym ''​read(fd, buf, len)'' ​jest 
 +równoważne ''​recv(fd,​ buf, len, 0)''​ i ''​recvfrom(sockfd,​ buf, len, 0, NULL, NULL)''​. \\ 
 +Podobnie poza funkcją ''​write''​ do wysyłania można ​używać też funkcji ​''​send'',​ 
 +<​small>''​sendto''​ i ''​sendmsg''</​small>,​ analogicznych do powyższych. \\ 
 +Dodatkowy argument ​''​recv''/''​send'' ​(pole flagpozwala na zmianę zachowania 
 +tych funkcji i będzie omawiany później.\\ 
 +<​small>​ 
 +''​recvfrom''​ i ''​sendto''​ mają dodatkowe pole na adres nadawcy/​odbiorcy i są 
 +przeznaczone dla protokołów warstwy transportowej pozwalających na komunikację 
 +po jednym gnieździe z wieloma partnerami. Będą omawiane przy obsłudze UDP. 
 +</​small>​
  
-//Zadanie ​11.// Przed wywołaniem ''​connect''​ ustal lokalny adres funkcją ''​bind''​. Powtórz zadanie 8. +~~Zadanie.#~~ Zmień program tak, by zamiast ''​read(…)''​ używał funkcji ''​recv(…)''​ 
-<​html>​</small></​html>+ 
 +<​small>​ 
 +~~Zadanie.#​~~ ​Przed wywołaniem ''​connect''​ ustal lokalny adres funkcją ''​bind''​. Powtórz zadanie 8 i 9
 +</​small>​
sk2/sockets_intro.1664612123.txt.gz · ostatnio zmienione: 2022/10/01 10:15 przez jkonczak