Provided by: manpages-pl-dev_4.23.1-1_all
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⟩.