User Tools

Site Tools


sk2:sockets_full

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
sk2:sockets_full [2025/10/16 20:26] – jkonczaksk2:sockets_full [2026/11/01 18:31] (current) – [UDP vs TCP - przypomnienie] jkonczak
Line 16: Line 16:
 kierowane tylko na ten adres – np. 127.0.0.1 (''INADDR_LOOPBACK'') jeśli kierowane tylko na ten adres – np. 127.0.0.1 (''INADDR_LOOPBACK'') jeśli
 połączenia mają być ograniczone do połączeń z localhosta. połączenia mają być ograniczone do połączeń z localhosta.
 +\\
 +<small>Stałe ''INADDR_ANY'' i ''INADDR_LOOPBACK'' są w lokalnym porządku bajtów
 +(little/big endian), więc wpisując je np. do odpowiedniego pola struktury
 +''sockaddr_in'' trzeba zmienić porządek bajtów na sieciowy funkcją ''htonl''.
 +Dowolny adres IPv4 to 0.0.0.0, więc w tym szczególnym przypadku zmiana porządku
 +bajtów jest niepotrzebna.</small>
  
 **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ą +Argumentem funkcji ''listen'' jest ilość nowych połączeń które mogą czekać 
-w kolejce na odebranie (tj. połączeń dla których nie wykonano jeszcze funkcji +w kolejce na odebranie przez program (tj. połączeń dla których nie wykonano 
-''accept'')((Argument "backlog" funkcji ''listen'' powinien się zawierać w+jeszcze funkcji ''accept'', ale system operacyjny odpowiedział klientowi że 
 +udało mu się połączyć)((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''.)). 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. Jeśli w kolejce czeka 
 +już jakieś połączenie, funkcja ''accept'' natychmiast się kończy, w przeciwym 
 +razie blokuje się do czasu aż pojawi się nowy klient.
  
 <html><small></html>Tworzenie kolejnych deskryptorów plików oraz wyniki ''lsof'', ''strace'' i ''ss'' są zaprezentowane [[sk2:sockets_full:tcp_srv_img|tutaj]]<html></small></html> <html><small></html>Tworzenie kolejnych deskryptorów plików oraz wyniki ''lsof'', ''strace'' i ''ss'' są zaprezentowane [[sk2:sockets_full:tcp_srv_img|tutaj]]<html></small></html>
Line 47: Line 57:
  
 Funkcja ''accept'' (podobnie jak wprowadzana za chwilę ''recvfrom'') może przekazać informację o adresie z którego nawiązano połączenie. W tym celu należy jej podać: Funkcja ''accept'' (podobnie jak wprowadzana za chwilę ''recvfrom'') może przekazać informację o adresie z którego nawiązano połączenie. W tym celu należy jej podać:
-  * gdzie ma zapisać ten adres – tj. podać adres struktury sockaddr (drugi argument)+  * gdzie ma zapisać ten adres – tj. podać adres struktury ''sockaddr'' (drugi argument)
   * adres zmiennej, która w momencie wywołania ''accept'' ma wpisany rozmiar przekazanej struktury (trzeci argument)<html><small style="user-select: none;"></html><code cpp>   * adres zmiennej, która w momencie wywołania ''accept'' ma wpisany rozmiar przekazanej struktury (trzeci argument)<html><small style="user-select: none;"></html><code cpp>
 sockaddr_in nazwa_zmiennej; sockaddr_in nazwa_zmiennej;
Line 110: Line 120:
 </code> </code>
  
-UDP nie nawiązuje połączenia – do odbioru i wysyłania wiadomości należy używać funkcji ''sendto'' i ''recvfrom'' (lub ''recv''/''read'', jeśli nie obchodzi nas nadawca). \\ W formie ułatwienia BSD socket API pozwala działać gniazdom UDP w trybie pseudo-połączeniowym - tzn. można wywołać funkcję ''connect'' (która ustali adres odbiorcy) i dalej korzystać z ''send'' / ''write''.+UDP nie nawiązuje połączenia – do odbioru i wysyłania wiadomości należy używać funkcji ''sendto'' i ''recvfrom'' (lub ''recv''/''read'', jeśli nie obchodzi nas nadawca). \\ W formie ułatwienia BSD socket API pozwala działać gniazdom UDP w trybie pseudo-połączeniowym - tzn. można wywołać funkcję ''connect'' (która ustali adres odbiorcy) i dalej korzystać z ''send'' / ''write''.  
 +\\ 
 +<small>Więcej o trybie pseudo-połączeniowym na wykładzie, warto też zajrzeć na 
 +[[https://blog.cloudflare.com/everything-you-ever-wanted-to-know-about-udp-sockets-but-were-afraid-to-ask-part-1/| wpis z bloga cloudflare]] streszczający ten temat. 
 +</small>
  
 Przykład użycia funkcji ''sendto'' i ''recvfrom'':  Przykład użycia funkcji ''sendto'' i ''recvfrom'': 
sk2/sockets_full.1760646392.txt.gz · Last modified: (external edit)