Różnice między wybraną wersją a wersją aktualną.
| Both sides previous revision Poprzednia wersja | |||
|
sk2:sockets_full [2025/10/16 22:26] jkonczak |
sk2:sockets_full [2026/10/08 21:26] (aktualna) jkonczak |
||
|---|---|---|---|
| Linia 16: | Linia 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> | ||
| Linia 47: | Linia 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; | ||