Provided by: manpages-pl-dev_0.7-2_all 

NAZWA
accept - przyjmowanie połączenia na gnieździe
SKŁADNIA
#include <sys/types.h>
#include <sys/socket.h>
int accept(int s, struct sockaddr *addr, socklen_t *addrlen);
OPIS
Uwaga! To tłumaczenie może być nieaktualne!
Funkcja accept jest używana z połączeniowymi typami gniazd (SOCK_STREAM, SOCK_SEQPACKET i SOCK_RDM).
Wyciąga ona pierwsze żądanie połączenia z kolejki oczekujących połączeń, tworzy nowo podłączone gniazdo o
tych samych właściwościach co s i alokuje nowy deskryptor pliku dla gniazda, który to deskryptor jest
zwracany. Nowo utworzone gniazdo nie jest już w stanie nasłuchiwania. Oryginalne gniazdo s pozostaje po
wywołaniiu funkcji niezmienione. Należy zauważyć, że żadne znaczniki dotyczące deskryptora pliku
(wszystko, co można ustawić za pomocą F_SETFL, jak stan nieblokujący czy asynchroniczny) nie są poprzez
accept dziedziczone.
Argument s 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 łączącej się
jednostki, przekazany przez warstwę komunikacyjną. Dokładny format adresu przekazywanego w parametrze
addr jest określony poprzez rodzinę gniazda (zobacz socket(2) i strony podręcznika dotyczące
odpowiedniego protokołu). Argument addrlen jest parametrem wartościowo-wynikowym: powinien początkowo
zawierać rozmiar struktury, na którą wskazuje addr; po zakończeniu będzie zawierał rzeczywistą długość
zwracanego adresu (w bajtach). Gdy addr jest równe NULL, to nic nie jest wypełniane.
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 zwraca EAGAIN.
Aby być informowanym o nadchodzących do gniazda połączeniach, można użyć select(2) lub poll(2). 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).
Dla niektórych protokołów wymagających bezpośredniego potwierdzania, takich jak DECNet, accept może być
uważane za funkcję zdejmującą 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.
UWAGI
Nie zawsze po dostarczeniu SIGIO musi istnieć oczekujące połączenie. To samo dotyczy select(2) i poll(2),
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, s powinno mieć
ustawiony znacznik O_NONBLOCK (zobacz socket(7)).
WARTOŚĆ ZWRACANA
Wywołanie w przypadku błędu zwraca -1. Gdy zakończy sie pomyślnie zwraca nieujemną liczbę całkowitą,
która jest deskryptorem przyjętego gniazda.
OBSŁUGA BŁĘDÓW
Linuksowe accept 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
Funkcja accept musi zakończyć się niepomyślnie gdy:
EAGAIN lub EWOULDBLOCK
Gniazdo jest zaznaczone jako nieblokujące a brak jest połączeń, które mogłyby zostać przyjęte.
EBADF Deskryptor jest nieprawidłowy.
ENOTSOCK
Deskryptor odnosi się do pliku, zamiast do gniazda.
EOPNOTSUPP
Przekazane gniazdo nie jest typu SOCK_STREAM.
EINTR Funkcja systemowa została przerwana wskutek odebrania sygnału przed prawidłowym nawiązaniem
połączenia.
ECONNABORTED
Połączenie zostało przerwane.
EINVAL Gniazdo nie nasłuchuje połączeń.
EMFILE Osiągnięte zostało ograniczenie liczby otwartych deskryptorów plików dla procesu.
ENFILE Osiągnięte zostało systemowe ograniczenie liczby otwartych deskryptorów plików.
Funkcja accept może zakończyć się niepomyślnie gdy:
EFAULT Parametr addr nie znajduje się w przestrzeni adresowej dostępnej do zapisu dla użytkownika.
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.
EPROTO Wystąpił błąd protokołu.
W Linuksie accept może również zakończyć się niepomyślnie gdy:
EPERM Reguły firewalla zabraniają połączenia.
Dodatkowo, dla nowego gniazda mogą być zwracane błędy sieciowe zdefiniowane
dla danego protokołu. Różne jądra Linuksa mogą zwracać inne błędy, takie jak ENOSR,
ESOCKTNOSUPPORT, EPROTONOSUPPORT, ETIMEDOUT. Wartość ERESTARTSYS może być obserwowana podczas
śledzenia.
ZGODNE Z
SVr4, 4.4BSD (funkcja accept pojawiła się pierwotnie w BSD 4.2). Strona podręcznika BSD opisuje pięć
możliwych zwracanych błędów (EBADF, ENOTSOCK, EOPNOTSUPP, EWOULDBLOCK, EFAULT). SUSv3 opisuje błędy
EAGAIN, EBADF, ECONNABORTED, EINTR, EINVAL, EMFILE, ENFILE, ENOBUFS, ENOMEM, ENOTSOCK, EOPNOTSUPP,
EPROTO, EWOULDBLOCK. SUSv2 opisuje dodatkowo błędy EFAULT i ENOSR.
Linuksowe accept _nie_ dziedziczy znaczników gniazda, takich jak O_NONBLOCK. Takie zachowanie różni się
od innych implementacji gniazd BSD. Przenośne programy nie powinny zakładać takiego zachowania i zawsze
ustawiać dla gniazda zwracanego przez accept wszystkie potrzebne znaczniki.
UWAGA
Trzeci argument accept był 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. Późniejsze szkice POSIX używają tu `socklen_t *' i tak samo robią
Single Unix Specification i glibc2. Cytując 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 TAKŻE
bind(2), connect(2), listen(2), select(2), socket(2)
INFORMACJE O TŁUMACZENIU
Powyższe tłumaczenie pochodzi z nieistniejącego już Projektu Tłumaczenia Manuali i może nie być aktualne.
W razie zauważenia różnic między powyższym opisem a rzeczywistym zachowaniem opisywanego programu lub
funkcji, prosimy o zapoznanie się z oryginalną (angielską) wersją strony podręcznika za pomocą polecenia:
man --locale=C 2 accept
Prosimy o pomoc w aktualizacji stron man - więcej informacji można znaleźć pod adresem
http://sourceforge.net/projects/manpages-pl/.
Linux 2.2 2002-04-23 ACCEPT(2)