Provided by: manpages-pl-dev_20060617-3_all bug

NAZWA

       accept - przyjmowanie polczenia na gniedzie

SK/LADNIA

       #include <sys/types.h>
       #include <sys/socket.h>

       int accept(int s, struct sockaddr *addr, socklen_t *addrlen);

OPIS

       Funkcja  accept jest uywana z polczeniowymi typami gniazd (SOCK_STREAM,
       SOCK_SEQPACKET i SOCK_RDM).  Wyciga  ona  pierwsze  danie  polczenia  z
       kolejki oczekujcych polcze, tworzy nowo podlczone gniazdo o tych samych
       wlaciwociach co s i alokuje nowy deskryptor pliku dla gniazda, ktory to
       deskryptor  jest  zwracany. Nowo utworzone gniazdo nie jest ju w stanie
       nasluchiwania.  Oryginalne gniazdo s pozostaje  po  wywolaniiu  funkcji
       niezmienione. Naley zauway, e adne znaczniki dotyczce deskryptora pliku
       (wszystko, co mona ustawi za pomoc F_SETFL, jak  stan  nieblokujcy  czy
       asynchroniczny) nie s poprzez accept dziedziczone.

       Argument s jest gniazdem, ktore zostalo utworzone wywolaniem socket(2),
       przywizanym do adresu lokalnego z pomoc bind(2), i nasluchujcym  polcze
       po wywolaniu listen(2).

       Argument  addr  jest wskanikiem do struktury sockaddr. Do struktury tej
       jest wpisywany adres  lczcej  si  jednostki,  przekazany  przez  warstw
       komunikacyjn.  Dokladny  format adresu przekazywanego w parametrze addr
       jest  okrelony  poprzez  rodzin  gniazda  (zobacz  socket(2)  i  strony
       podrcznika  dotyczce  odpowiedniego  protokolu).  Argument addrlen jest
       parametrem wartociowo-wynikowym:  powinien  pocztkowo  zawiera  rozmiar
       struktury,   na  ktor  wskazuje  addr;  po  zakoczeniu  bdzie  zawieral
       rzeczywist dlugo zwracanego adresu (w bajtach).  Gdy  addr  jest  rowne
       NULL, to nic nie jest wypelniane.

       Jeli nie ma zalegajcych polcze w kolejce, a gniazdo nie jest zaznaczone
       jako nieblokujce, to accept blokuje proces  wywolujcy  a  do  uzyskania
       polczenia.  Gdy  gniazdo  jest  zaznaczone  jako  nieblokujce  i nie ma
       zalegajcych polcze w kolejce, accept zwraca EAGAIN.

       Aby by informowanym o nadchodzcych  do  gniazda  polczeniach,  mona  uy
       select(2)   lub  poll(2).   Podczas  proby  nowego  polczenia  zostanie
       dostarczone zdarzenie odczytywalnoci (readable)  i  wtedy  mona  wywola
       accept  aby uzyska gniazdo tego polczenia. Inaczej, mona ustawi gniazdo
       tak, by dostarczalo SIGIO za kadym razem, gdy  si  na  nim  co  zacznie
       dzia; szczegoly mona znale w socket(7).

       Dla  niektorych  protokolow  wymagajcych  bezporedniego  potwierdzania,
       takich jak DECNet, accept moe by uwaane za funkcj  zdejmujc  z  kolejki
       nastpne danie polczenia, nie powodujc potwierdzenia. Potwierdzenie mona
       spowodowa przez normalny odczyt, lub zapis na nowym deskryptorze pliku,
       a odrzucenie mona spowodowa, zamykajc gniazdo. Obecnie pod Linuksem tak
       semantyk ma tylko DECNet.

UWAGI

       Nie zawsze po dostarczeniu SIGIO musi istnie  oczekujce  polczenie.  To
       samo dotyczy select(2) i poll(2), zwracajcych zdarzenie odczytywalnoci,
       poniewa polczenie moglo zosta usunite przez  asynchroniczny  bld  sieci
       lub  inny  wtek,  przed  wywolaniem  accept.   Jeli  to  si  zdarzy, to
       wywolanie bdzie blokowa, oczekujc nastpnego polczenia.  Aby upewni  si,
       e  accept  nigdy  nie bdzie blokowalo, s powinno mie ustawiony znacznik
       O_NONBLOCK (zobacz socket(7)).

WARTO ZWRACANA

       Wywolanie w przypadku bldu zwraca -1. Gdy zakoczy sie  pomylnie  zwraca
       nieujemn liczb calkowit, ktora jest deskryptorem przyjtego gniazda.

OBS/LUGA B/LD'OW

       Linuksowe  accept  przekazuje  zalegajce  ju  na  nowym  gniedzie  bldy
       sieciowe  jako  kod  bldu  z  accept.   Zachowanie  to   roni   si   od
       implementacji gniazd w BSD. Dla sensownego dzialania, aplikacja powinna
       wykrywa po wykonaniu accept  bldy  sieciowe,  zdefiniowane  dla  danego
       protokolu  i  traktowa  je  jak  EAGAIN,  czyli ponawia prob. W wypadku
       TCP/IP  s  to  ENETDOWN,  EPROTO,   ENOPROTOOPT,   EHOSTDOWN,   ENONET,
       EHOSTUNREACH, EOPNOTSUPP i ENETUNREACH.

B/LDY

       Funkcja accept musi zakoczy si niepomylnie gdy:

       EAGAIN lub EWOULDBLOCK
              Gniazdo  jest  zaznaczone  jako  nieblokujce a brak jest polcze,
              ktore moglyby zosta przyjte.

       EBADF  Deskryptor jest nieprawidlowy.

       ENOTSOCK
              Deskryptor odnosi si do pliku, zamiast do gniazda.

       EOPNOTSUPP
              Przekazane gniazdo nie jest typu SOCK_STREAM.

       EINTR  Funkcja systemowa zostala przerwana  wskutek  odebrania  sygnalu
              przed prawidlowym nawizaniem polczenia.

       ECONNABORTED
              Polczenie zostalo przerwane.

       EINVAL Gniazdo nie nasluchuje polcze.

       EMFILE Osignite  zostalo  ograniczenie  liczby  otwartych  deskryptorow
              plikow dla procesu.

       ENFILE Osignite  zostalo  systemowe   ograniczenie   liczby   otwartych
              deskryptorow plikow.

       Funkcja accept moe zakoczy si niepomylnie gdy:

       EFAULT Parametr  addr  nie znajduje si w przestrzeni adresowej dostpnej
              do zapisu dla uytkownika.

       ENOBUFS, ENOMEM
              Jest niedostateczna ilo wolnej pamici.  Oznacza to zazwyczaj,  e
              istnieje ograniczenie dla przydzielania pamici na bufory gniazd,
              nie za e zabraklo pamici w systemie.

       EPROTO Wystpil bld protokolu.

       W Linuksie accept moe rownie zakoczy si niepomylnie gdy:

       EPERM  Reguly firewalla zabraniaj polczenia.

       Dodatkowo,  dla  nowego  gniazda  mog   by   zwracane   bldy   sieciowe
       zdefiniowane
              dla  danego  protokolu.  Rone jdra Linuksa mog zwraca inne bldy,
              takie jak ENOSR,  ESOCKTNOSUPPORT,  EPROTONOSUPPORT,  ETIMEDOUT.
              Warto ERESTARTSYS moe by obserwowana podczas ledzenia.

ZGODNE Z

       SVr4, 4.4BSD (funkcja accept pojawila si pierwotnie w BSD 4.2).  Strona
       podrcznika BSD opisuje pi moliwych zwracanych bldow  (EBADF,  ENOTSOCK,
       EOPNOTSUPP,  EWOULDBLOCK,  EFAULT).   SUSv3 opisuje bldy EAGAIN, EBADF,
       ECONNABORTED, EINTR, EINVAL, EMFILE, ENFILE, ENOBUFS, ENOMEM, ENOTSOCK,
       EOPNOTSUPP, EPROTO, EWOULDBLOCK.  SUSv2 opisuje dodatkowo bldy EFAULT i
       ENOSR.

       Linuksowe  accept  _nie_  dziedziczy  znacznikow  gniazda,  takich  jak
       O_NONBLOCK.   Takie  zachowanie  roni si od innych implementacji gniazd
       BSD.  Przenone programy nie powinny zaklada takiego zachowania i zawsze
       ustawia   dla  gniazda  zwracanego  przez  accept  wszystkie  potrzebne
       znaczniki.

UWAGA

       Trzeci argument accept byl pierwotnie zadeklarowany  jako  `int  *'  (i
       jest  pod  libc4 i libc5 oraz na wielu innych systemach, takich jak BSD
       4.*, SunOS 4, SGI); W szkicu standardu POSIX 1003.1g chciano to  zmieni
       na  `size_t  *'  i tak jest w SunOS 5.  Poniejsze szkice POSIX uywaj tu
       `socklen_t *' i tak samo  robi  Single  Unix  Specification  i  glibc2.
       Cytujc  Linusa Torvaldsa: _Any_ sane library _must_ have "socklen_t" be
       the same size as int.  Anything else breaks any BSD socket layer stuff.
       POSIX  initially  _did_  make it a size_t, and I (and hopefully others,
       but obviously not too many) complained  to  them  very  loudly  indeed.
       Making  it  a  size_t is completely broken, exactly because size_t very
       seldom is the same size as "int" on 64-bit architectures, for  example.
       And  it  _has_ to be the same size as "int" because that's what the BSD
       socket interface is.  Anyway, the POSIX people eventually got  a  clue,
       and  created  "socklen_t".  They shouldn't have touched it in the first
       place, but once they did they felt it had to have a named type for some
       unfathomable  reason  (probably  somebody  didn't like losing face over
       having done the original stupid thing, so they  silently  just  renamed
       their blunder).

ZOBACZ TAKE

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

INFORMACJE O T/LUMACZENIU

       Powysze  tlumaczenie  pochodzi z nieistniejcego ju Projektu Tlumaczenia
       Manuali i moe nie by aktualne. W razie zauwaenia ronic  midzy  powyszym
       opisem  a  rzeczywistym  zachowaniem  opisywanego programu lub funkcji,
       prosimy o zapoznanie si z oryginaln (angielsk) wersj strony podrcznika.