plucky (2) accept.2.gz

Provided by: manpages-pl-dev_4.25.1-1_all bug

NAZWA

       accept, accept4 - przyjmuje połączenia na gnieździe

BIBLIOTEKA

       Standardowa biblioteka C (libc, -lc)

SKŁADNIA

       #include <sys/socket.h>

       int accept(int sockfd, struct sockaddr *_Nullable restrict addr,
                  socklen_t *_Nullable restrict addrlen);

       #define _GNU_SOURCE             /* zobacz feature_test_macros(7) */
       #include <sys/socket.h>

       int accept4(int sockfd, struct sockaddr *_Nullable restrict addr,
                  socklen_t *_Nullable restrict addrlen, int flags);

OPIS

       Wywołanie  systemowe  accept() jest używane z połączeniowymi typami gniazd (SOCK_STREAM, SOCK_SEQPACKET).
       Wyciąga ona pierwsze żądanie połączenia  z  kolejki  oczekujących  połączeń  dla  nasłuchującego  gniazda
       sockfd, tworzy nowo podłączone gniazdo i zwraca nowy deskryptor pliku odnoszący się do tego gniazda. Nowo
       utworzone gniazdo nie jest już w  stanie  nasłuchiwania.  Oryginalne  gniazdo  sockfd  pozostaje  po  tym
       wywołaniu niezmienione.

       Argument  sockfd  jest  gniazdem,  które  zostało  utworzone wywołaniem socket(2), przywiązanym do adresu
       lokalnego z pomocą bind(2), i nasłuchującym połączeń po wywołaniu listen(2).

       Argument addr jest wskaźnikiem do struktury sockaddr. Do struktury  tej  jest  wpisywany  adres  drugiego
       gniazda,  przekazany  przez  warstwę komunikacyjną. Dokładny format zwracanego adresu addr jest określony
       poprzez  rodzinę  adresową  gniazda  (zobacz  socket(2)  i  strony  podręcznika  dotyczące  odpowiedniego
       protokołu).  Gdy  addr  jest  równe  NULL, to nic nie jest wypełniane; w takim przypadku addrlen nie jest
       używane i również powinno wynosić NULL.

       Argument addrlen jest parametrem wartościowo-wynikowym: powinien początkowo zawierać rozmiar (w  bajtach)
       struktury, na którą wskazuje addr; po zakończeniu będzie zawierał rzeczywistą długość zwracanego adresu.

       Zwracany  adres  jest przycinany, jeśli udostępniony bufor jest zbyt mały; w tym przypadku addrlen zwróci
       wartość większą niż była podana w wywołaniu.

       Jeśli nie ma zalegających połączeń w kolejce,  a  gniazdo  nie  jest  zaznaczone  jako  nieblokujące,  to
       accept()  blokuje  proces  wywołujący  aż  do  uzyskania  połączenia.  Gdy  gniazdo  jest zaznaczone jako
       nieblokujące i nie ma zalegających połączeń w kolejce, accept() zawodzi z błędem EAGAIN lub EWOULDBLOCK.

       Aby być informowanym o nadchodzących do gniazda połączeniach, można użyć select(2), poll(2) lub epoll(7).
       Podczas  próby  nowego połączenia zostanie dostarczone zdarzenie odczytywalności (readable) i wtedy można
       wywołać accept() aby uzyskać gniazdo tego połączenia. Inaczej, można ustawić gniazdo tak, by  dostarczało
       SIGIO za każdym razem, gdy się na nim coś zacznie dziać; szczegóły można znaleźć w socket(7).

       Jeśli flags wynosi 0, to accept4() jest taka sama jak accept(). Następujące wartości flags można zsumować
       logicznie, aby uzyskać odmienne zachowanie:

       SOCK_NONBLOCK   Ustawia znacznik statusu pliku O_NONBLOCK na otwartym deskryptorze pliku (zob. open(2) do
                       którego  odnosi  się  nowy  deskryptor  pliku. Użycie tego znacznika zapobiega dodatkowym
                       wywołaniom do fcntl(2) przy uzyskaniu tego samego efektu.

       SOCK_CLOEXEC    Ustawia znacznik zamknięcia-przy-wykonaniu (FD_CLOEXEC) na nowym deskryptorze pliku. Opis
                       znacznika  O_CLOEXEC w podręczniku open(2) informuje o przypadkach, w których może się to
                       okazać przydatne.

WARTOŚĆ ZWRACANA

       W przypadku sukcesu, te  wywołania  systemowe  zwracają  deskryptor  pliku  dla  zaakceptowanego  gniazda
       (nieujemną liczbę całkowitą). W razie zaistnienia błędu, zwracane jest -1, ustawiane jest errno wskazując
       błąd, a addrlen nie ulega zmianie.

   Obsługa błędów
       Linuksowe accept (i accept4()) przekazuje zalegające już na nowym gnieździe błędy sieciowe jako kod błędu
       z  accept().  Zachowanie  to różni się od implementacji gniazd w BSD. Dla sensownego działania, aplikacja
       powinna wykrywać po wykonaniu accept() błędy sieciowe, zdefiniowane dla danego protokołu i  traktować  je
       jak  EAGAIN,  czyli  ponawiać  próbę.  W  wypadku  TCP/IP są to ENETDOWN, EPROTO, ENOPROTOOPT, EHOSTDOWN,
       ENONET, EHOSTUNREACH, EOPNOTSUPP i ENETUNREACH.

BŁĘDY

       EAGAIN lub EWOULDBLOCK
              Gniazdo  jest  oznaczone  jako  nieblokujące  i  nie  występują  połączenia   do   zaakceptowania.
              POSIX.1-2001  i  POSIX.1-2008  zezwalają na zwrócenie w takim przypadku dowolnego z dwóch błędów i
              nie wymagają, aby miały one taką samą wartość, dlatego przenośne aplikacje powinny  sprawdzić  oba
              przypadki.

       EBADF  sockfd nie jest deskryptorem otwartego pliku.

       ECONNABORTED
              Połączenie zostało przerwane.

       EFAULT Argument addr nie znajduje się w przestrzeni adresowej dostępnej do zapisu dla użytkownika.

       EINTR  Wywołanie  systemowe  zostało  przerwane  wskutek  odebrania sygnału przed prawidłowym nawiązaniem
              połączenia; zob. signal(7).

       EINVAL Gniazdo nie nasłuchuje połączeń lub addrlen jest nieprawidłowe (np. jest ujemne).

       EINVAL (accept4())  nieprawidłowa wartość w flags.

       EMFILE Zostało osiągnięte ograniczenie na liczbę otwartych deskryptorów plików dla procesu.

       ENFILE Zostało osiągnięte systemowe ograniczenie na całkowitą liczbę otwartych plików.

       ENOBUFS
       ENOMEM Jest niedostateczna ilość wolnej pamięci. Oznacza  to  zazwyczaj,  że  istnieje  ograniczenie  dla
              przydzielania pamięci na bufory gniazd, nie zaś że zabrakło pamięci w systemie.

       ENOTSOCK
              Deskryptor pliku sockfd nie odnosi się do gniazda.

       EOPNOTSUPP
              Przekazane gniazdo nie jest typu SOCK_STREAM.

       EPERM  Reguły zapory sieciowej zabraniają połączenia.

       EPROTO Wystąpił błąd protokołu.

       Dodatkowo,  dla  nowego gniazda mogą być zwracane błędy sieciowe zdefiniowane dla danego protokołu. Różne
       jądra Linux mogą zwracać inne  błędy,  takie  jak  ENOSR,  ESOCKTNOSUPPORT,  EPROTONOSUPPORT,  ETIMEDOUT.
       Wartość ERESTARTSYS może być obserwowana podczas śledzenia.

WERSJE

       W  Linuksie,  nowe  gniazdo  zwracane  przez accept() nie dziedziczy znaczników statusu pliku, takich jak
       O_NONBLOCK i O_ASYNC od nasłuchującego gniazda. Takie zachowanie różni się od  tradycyjnej  implementacji
       gniazd  BSD.  Przenośne  programy  nie  powinny  polegać na dziedziczeniu lub niedziedziczeniu znaczników
       statusu pliku i zawsze  ustawiać  wprost  wszystkie  wymagane  znaczniki  na  gnieździe  zwracanym  przez
       accept(2).

STANDARDY

       accept()
              POSIX.1-2008.

       accept4()
              Linux.

HISTORIA

       accept()
              POSIX.1-2001, SVr4, 4.4BSD (accept() pojawiło się pierwotnie w 4.2BSD).

       accept4()
              Linux 2.6.28, glibc 2.10.

UWAGI

       Nie  zawsze po dostarczeniu SIGIO musi istnieć oczekujące połączenie. To samo dotyczy select(2),  poll(2)
       i epoll(7), zwracających zdarzenie odczytywalności,  ponieważ  połączenie  mogło  zostać  usunięte  przez
       asynchroniczny  błąd  sieci  lub inny wątek, przed wywołaniem accept(). Jeśli to się zdarzy, to wywołanie
       będzie blokować, oczekując  następnego  połączenia.  Aby  upewnić  się,  że  accept()  nigdy  nie  będzie
       blokowało, przekazane gniazdo sockfd powinno mieć ustawiony znacznik O_NONBLOCK (zobacz socket(7)).

       Dla niektórych protokołów wymagających bezpośredniego potwierdzania, takich jak DECnet, accept() może być
       uważane za wywołanie zdejmujące z kolejki  następne  żądanie  połączenia,  nie  powodując  potwierdzenia.
       Potwierdzenie można spowodować przez normalny odczyt, lub zapis na nowym deskryptorze pliku, a odrzucenie
       można spowodować, zamykając gniazdo. Obecnie pod Linuksem taką semantykę ma tylko DECnet.

   Typ socklen_t
       W oryginalnej implementacji gniazd BSD  (i  innych  starszych  systemów)  trzeci  argument  accept()  był
       deklarowany  jako int *. Szkic POSIX.1g planował zmienić to na size_t *C; późniejsze standardy POSIX oraz
       glibc 2.x posiadają socklen_t * .

PRZYKŁADY

       Zobacz bind(2).

ZOBACZ TAKŻE

       bind(2), connect(2), listen(2), select(2), socket(2), socket(7)

TŁUMACZENIE

       Autorami polskiego tłumaczenia niniejszej strony podręcznika  są:  Przemek  Borys  <pborys@dione.ids.pl>,
       Andrzej Krzysztofowicz <ankry@green.mf.pg.gda.pl> i Michał Kułach <michal.kulach@gmail.com>

       Niniejsze  tłumaczenie  jest  wolną  dokumentacją.  Bliższe informacje o warunkach licencji można uzyskać
       zapoznając się z GNU General Public License w wersji  3  ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩  lub
       nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.

       Błędy  w  tłumaczeniu  strony  podręcznika  prosimy  zgłaszać  na  adres  listy dyskusyjnej ⟨manpages-pl-
       list@lists.sourceforge.net⟩.