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 [2024/10/02 13:47]
jkonczak [Hello world]
sk2:sockets_intro [2025/10/02 22:24] (aktualna)
jkonczak
Linia 35: 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 47: 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>​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>​
  
Linia 72: Linia 72:
 API stworzone dla systemu BSD zostało przyjęte przez praktycznie wszystkie systemy operacyjne (POSIX socket API, WinSock). API stworzone dla systemu BSD zostało przyjęte przez praktycznie wszystkie systemy operacyjne (POSIX socket API, WinSock).
  
-Pełen opis: [[http://​www.cs.put.poznan.pl/​ddwornikowski/​sieci/​sieci2/​bsdsockets.html]] oraz [[https://​en.wikipedia.org/​wiki/​Berkeley_sockets]]+Po więcej informacji o BSD Socket API zajrzyj na [[https://​en.wikipedia.org/​wiki/​Berkeley_sockets]].
  
 ''​man 7 socket tcp udp''​\\ ''​man 7 socket tcp udp''​\\
Linia 89: Linia 89:
 MSB/LSB first – to głównie problem producentów sprzętu. MSB/LSB first – to głównie problem producentów sprzętu.
 Little/big endian - to problem programistów.\\ Little/big endian - to problem programistów.\\
-[[https://​en.wikipedia.org/​wiki/​Most_significant_bit]]+[[https://​en.wikipedia.org/​wiki/​Bit_numbering#​Most-_vs_least-significant_bit_first]]
 [[https://​pl.wikipedia.org/​wiki/​Kolejność_bajtów]] [[https://​pl.wikipedia.org/​wiki/​Kolejność_bajtów]]
 <​html></​small></​html>​ <​html></​small></​html>​
Linia 98: Linia 98:
 uint16_t networkEndianessPort = htons(hostEndianessPort);​ uint16_t networkEndianessPort = htons(hostEndianessPort);​
 </​code>​ </​code>​
-Opis funkcji pomocniczych – patrz ''​man byteorder'' ​lub [[http://​www.cs.put.poznan.pl/​ddwornikowski/​sieci/​sieci2/​bsdsockets.html#​funkcje-pomocnicze|strona Darka Dwornikowskiego]]+Opis funkcji pomocniczych – patrz ''​man byteorder''​
  
 ==== Zapis adresu gniazda ==== ==== Zapis adresu gniazda ====
Linia 108: 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 – patrz ''​man 7 ip''​ i ''​man netinet_in.h'' ​lub  +Opis struktury – patrz ''​man sockaddr'', ​''​man 7 ip''​ i ''​man netinet_in.h''​
-[[http://​www.cs.put.poznan.pl/​ddwornikowski/​sieci/​sieci2/​bsdsockets.html#​glowne-funkcje-interfejsu-gniazd|strona Darka]]+
  
 <​html><​small></​html>​ <​html><​small></​html>​
 C nie pozwala na dziedziczenie,​ więc zamiast tego ([[https://​en.wikipedia.org/​wiki/​Type_punning#​Sockets_example]]) struktura ''​sockaddr''​ ma kilka "​specjalizacji"​ dla konkretnej rodziny adresów: C nie pozwala na dziedziczenie,​ więc zamiast tego ([[https://​en.wikipedia.org/​wiki/​Type_punning#​Sockets_example]]) struktura ''​sockaddr''​ ma kilka "​specjalizacji"​ dla konkretnej rodziny adresów:
 +<​html><​div style="​margin-top:​-1.4em"></​div></​html>​
   *''​sockaddr_in''​ (INET, czyli IPv4)   *''​sockaddr_in''​ (INET, czyli IPv4)
   *''​sockaddr_in6''​ (INET6, czyli IPv6)   *''​sockaddr_in6''​ (INET6, czyli IPv6)
Linia 120: 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 136: Linia 136:
     * trzeci argument funkcji connect to rozmiar struktury opisującej adres – ''​sizeof()''​ zmiennej lub typu     * trzeci argument funkcji connect to rozmiar struktury opisującej adres – ''​sizeof()''​ zmiennej lub typu
   * przed wywołaniem funkcji ''​close()''​ zamykał połączenie funkcją ''​shutdown()'';​ \\ <​html><​small></​html>​w funkcji ''​shutdown()''​ można osobno zakończyć nadawanie i odbiór, drugi argument określa co zakończyć –  ''​SHUT_RD''​ /  ''​SHUT_WR''​ / ''​SHUT_RDWR''<​html></​small></​html>​   * przed wywołaniem funkcji ''​close()''​ zamykał połączenie funkcją ''​shutdown()'';​ \\ <​html><​small></​html>​w funkcji ''​shutdown()''​ można osobno zakończyć nadawanie i odbiór, drugi argument określa co zakończyć –  ''​SHUT_RD''​ /  ''​SHUT_WR''​ / ''​SHUT_RDWR''<​html></​small></​html>​
-Opis funkcji ​– [[https://​www.cs.put.poznan.pl/​ddwornikowski/​sieci/​sieci2/​bsdsockets.html#​glowne-funkcje-interfejsu-gniazd|strona Darka]] lub ''​man 3 …''​ / ''​man 3p …''​\\+Opis funkcji ​znajdziesz w podręczniku systemowym (''​man 3 …''​ / ''​man 3p …''​)\\
 Potrzebne pliki nagłówkowe to: Potrzebne pliki nagłówkowe to:
 <code cpp> <code cpp>
Linia 144: 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 ​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.+~~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.
  
 ==== Funkcje send/​recv/​… ==== ==== Funkcje send/​recv/​… ====
Linia 165: Linia 165:
 </​small>​ </​small>​
  
-//Zadanie ​10.// Zmień program tak, by zamiast ''​read(…)''​ używał funkcji ''​recv(…)''​+~~Zadanie.#~~ Zmień program tak, by zamiast ''​read(…)''​ używał funkcji ''​recv(…)''​
  
 <​small>​ <​small>​
-//Zadanie ​11.// Przed wywołaniem ''​connect''​ ustal lokalny adres funkcją ''​bind''​. Powtórz zadanie 8 i 9.+~~Zadanie.#~~ Przed wywołaniem ''​connect''​ ustal lokalny adres funkcją ''​bind''​. Powtórz zadanie 8 i 9.
 </​small>​ </​small>​
sk2/sockets_intro.1727869629.txt.gz · ostatnio zmienione: 2024/10/02 13:47 przez jkonczak