Narzędzia użytkownika

Narzędzia witryny


sk2:sockets_full

Różnice

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

Odnośnik do tego porównania

Both sides previous revision Poprzednia wersja
sk2:sockets_full [2024/10/09 15:17]
jkonczak [Interface gniazd BSD (1/2)]
sk2:sockets_full [2025/10/09 23:46] (aktualna)
jkonczak
Linia 4: Linia 4:
 ----- -----
 Funkcja ''​socket''​ i kolejność wywoływania funkcji z API gniazd na deskryptorze zwróconym przez tę funkcję:​\\ ​ Funkcja ''​socket''​ i kolejność wywoływania funkcji z API gniazd na deskryptorze zwróconym przez tę funkcję:​\\ ​
-<​html><​object id="​svg-object"​ data="/​jkonczak/​_media/​sk2:​gniazdo-diagram.svg"​ type="​image/​svg+xml"></​object></​html>​\\ +<​html><​object id="​svg-object"​ data="/​jkonczak/​_media/​sk2:​gniazdo-diagram.svg"​ type="​image/​svg+xml"></​object></​html>​
-(Porównaj z: [[http://​www.cs.put.poznan.pl/​ddwornikowski/​sieci/​sieci2/​bsdsockets.html#​rys-1]].)+
  
 ===== Serwer TCP ===== ===== Serwer TCP =====
Linia 19: Linia 18:
  
 **Wywołanie funkcji ''​listen''​ nakazuje systemowi operacyjnemu czekać na połączenia** (porównaj z: ''​connect''​). Wykonanie funkcji listen jest natychmiastowe – ta funkcja nie czeka na połączenie,​ tylko informuje system operacyjny że nowe połączenia przychodzące na ustawiony adres mają być kierowane na to gniazdo. \\ **Wywołanie funkcji ''​listen''​ nakazuje systemowi operacyjnemu czekać na połączenia** (porównaj z: ''​connect''​). Wykonanie funkcji listen jest natychmiastowe – ta funkcja nie czeka na połączenie,​ tylko informuje system operacyjny że nowe połączenia przychodzące na ustawiony adres mają być kierowane na to gniazdo. \\
-Argumentem funkcji ''​listen''​ jest ilość nowych połączeń które czekają w kolejce na odebranie (tj. połączeń dla których nie wykonano jeszcze funkcji ''​accept''​)((Argument "​backlog"​ funkcji ''​listen''​ powinien się zawierać w zakresie ''​1''​÷''​SOMAXCONN''​ (w tej chwili ​równe 128 w Linuksie) i jest traktowany jako podpowiedź,​ tzn. system operacyjny może używać innego limitu niż podany w argumencie ''​listen''​.)).+Argumentem funkcji ''​listen''​ jest ilość nowych połączeń które czekają 
 +w kolejce na odebranie (tj. połączeń dla których nie wykonano jeszcze funkcji 
 +''​accept''​)((Argument "​backlog"​ funkcji ''​listen''​ powinien się zawierać w 
 +zakresie ''​1''​÷''​SOMAXCONN''​ (w tej chwili ​o wartości [[https://​elixir.bootlin.com/​linux/​v6.17.1/​source/​include/​linux/​socket.h#​L298|4096 ​w Linuksie]]) i jest traktowany jako podpowiedź,​ tzn. system operacyjny może używać innego limitu niż podany w argumencie ''​listen''​.)).
  
 Do odebrania nowych połączeń używa się funkcji ''​accept(…)''​. **Funkcja ''​accept''​ zwraca nowe gniazdo** reprezentujące nawiązane połączenie. Do odebrania nowych połączeń używa się funkcji ''​accept(…)''​. **Funkcja ''​accept''​ zwraca nowe gniazdo** reprezentujące nawiązane połączenie.
Linia 34: Linia 36:
   * zakończy program.   * zakończy program.
  
-~~Zadanie.#​~~a Krótko((https://​github.com/torvalds/linux/search?​q=TCP_TIMEWAIT_LEN)) po zamknięciu programu serwera sprawdź poleceniem ''​netstat -tpn''​ oraz ''​ss -atnop''​ w jakim stanie jest połączenie. Przypomnij sobie co oznacza ten stan – [[https://​tools.ietf.org/​html/​rfc793#​page-22|RFC793]]. Spróbuj w tym czasie uruchomić ponownie program serwera. \\ ~~Zadanie.#​2~~b Ustaw przed wywołaniem ''​bind''​ opcję ''​SO_REUSEADDR''​ gniazda (kod poniżej) i powtórz zadanie 2a.<code cpp>​const int one = 1;+~~Zadanie.#​~~a Krótko((https://​elixir.bootlin.com/linux/v6.17.1/​source/​include/​net/​tcp.h#​L128)) po zamknięciu programu serwera sprawdź poleceniem ''​netstat -tpn''​ oraz ''​ss -atnop''​ w jakim stanie jest połączenie. Przypomnij sobie co oznacza ten stan – [[https://​tools.ietf.org/​html/​rfc793#​page-22|RFC793]]. Spróbuj w tym czasie uruchomić ponownie program serwera. \\ ~~Zadanie.#​2~~b Ustaw przed wywołaniem ''​bind''​ opcję ''​SO_REUSEADDR''​ gniazda (kod poniżej) i powtórz zadanie 2a.<code cpp>​const int one = 1;
 setsockopt(sockFd,​ SOL_SOCKET, SO_REUSEADDR,​ &one, sizeof(one));</​code>​ setsockopt(sockFd,​ SOL_SOCKET, SO_REUSEADDR,​ &one, sizeof(one));</​code>​
 <​small>​ <​small>​
sk2/sockets_full.txt · ostatnio zmienione: 2025/10/09 23:46 przez jkonczak