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

NAZWA

       bind - przywiązuje nazwę do gniazda

BIBLIOTEKA

       Standardowa biblioteka C (libc, -lc)

SKŁADNIA

       #include <sys/socket.h>

       int bind(int sockfd, const struct sockaddr *addr,
                socklen_t addrlen);

OPIS

       Gdy  tworzone  jest gniazdo za pomocą socket(2), istnieje ono w przestrzeni nazw (rodzinie
       adresów), lecz nie ma przypisanego adresu. bind() przypisuje adres  określony  w  addr  do
       gniazda  odnoszącego  się do deskryptora pliku sockfd. addrlen określa rozmiar, w bajtach,
       struktury adresowej  na  którą  wskazuje  addr.  Tradycyjnie  operacja  ta  była  nazywana
       "przypisaniem nazwy do gniazda".

       Normalnie,  zanim gniazdo SOCK_STREAM będzie mogło odbierać połączenia (zobacz accept(2)),
       niezbędne jest przypisanie mu lokalnego adresu za pomocą bind().

       Reguły dotyczące przywiązywania nazw są różne w  różnych  rodzinach  adresów.  Szczegółowe
       informacje znajdują się na stronach podręcznika systemowego w sekcji 7. Dla AF_INET zobacz
       ip(7), dla AF_INET6 zobacz ipc6(7), dla AF_UNIX zobacz unix(7),  dla  AF_APPLETALK  zobacz
       ddp(7),  dla AF_PACKET zobacz packet(7), dla AF_X25 zobacz x25(7), a dla AF_NETLINK zobacz
       netlink(7).

       Faktyczna struktura przekazywana jako argument addr będzie zależała od rodziny  adresowej.
       Struktura sockaddr jest zdefiniowana podobnie do:

           struct sockaddr {
               sa_family_t sa_family;
               char        sa_data[14];
           }

       Jedyną  funkcją tej struktury jest rzutowanie wskaźnika struktury przekazanego w addr, aby
       uniknąć ostrzeżeń kompilatora. Zob. PRZYKŁADY poniżej.

WARTOŚĆ ZWRACANA

       Po pomyślnym zakończeniu zwracane jest zero. Po  błędzie  zwracane  jest  -1  i  ustawiane
       errno, wskazując błąd.

BŁĘDY

       EACCES Adres jest chroniony, a użytkownik nie jest superużytkownikiem.

       EADDRINUSE
              Podany adres już jest wykorzystywany.

       EADDRINUSE
              (gniazda  domeny  Internet)   Podano  zero  jako  numer  portu  w strukturze adresu
              gniazda, lecz przy próbie skojarzenia z portem dynamicznym (efemerycznym),  okazało
              się,  że  wszystkie  numery  portów  w  zakresie  portów  dynamicznych są aktualnie
              używane. Więcej informacji w opisie pliku /proc/sys/net/ipv4/ip_local_port_range  w
              podręczniku ip(7).

       EBADF  sockfd nie jest prawidłowym deskryptorem pliku.

       EINVAL Gniazdo jest już skojarzone z adresem.

       EINVAL addrlen  jest  nieprawidłowe  lub  addr nie jest prawidłowym adresem dla tej domeny
              gniazda.

       ENOTSOCK
              Deskryptor pliku sockfd nie odnosi się do gniazda.

       Następujące błędy odnoszą się do gniazd domeny UNIX-owej (AF_UNIX):

       EACCES Brak praw do przeszukiwania dla składowej ścieżki (zob. także path_resolution(7)).

       EADDRNOTAVAIL
              Zażądano nieistniejącego interfejsu lub żądany adres nie jest adresem lokalnym.

       EFAULT addr wskazuje poza dostępną dla użytkownika przestrzeń adresową.

       ELOOP  Podczas rozwiązywania addr napotkano zbyt wiele dowiązań symbolicznych.

       ENAMETOOLONG
              addr jest zbyt długie.

       ENOENT Fragment ścieżki gniazda odnoszący się do któregoś z katalogów nie istnieje.

       ENOMEM Brak pamięci jądra.

       ENOTDIR
              Składowa ścieżki nie jest katalogiem.

       EROFS  I-węzeł gniazda rezyduje na systemie plików przeznaczonym tylko do odczytu.

STANDARDY

       POSIX.1-2008.

HISTORIA

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

USTERKI

       Nie opisano opcji przezroczystych proxy.

PRZYKŁADY

       Przykładowy  program  używający  bind()  z  gniazdami  domeny  Internet  można  znaleźć  w
       getaddrinfo(3).

       Następujący  przykład  pokazuje  sposób  na  skojarzenie  gniazda strumieniowego w domenie
       uniksowej (AF_UNIX) i akceptować połączenia:

       #include <stdio.h>
       #include <stdlib.h>
       #include <string.h>
       #include <sys/socket.h>
       #include <sys/un.h>
       #include <unistd.h>

       #define MY_SOCK_PATH "/somepath"
       #define LISTEN_BACKLOG 50

       #define handle_error(msg) \
           do { perror(msg); exit(EXIT_FAILURE); } while (0)

       int
       main(void)
       {
           int                 sfd, cfd;
           socklen_t           peer_addr_size;
           struct sockaddr_un  my_addr, peer_addr;

           sfd = socket(AF_UNIX, SOCK_STREAM, 0);
           if (sfd == -1)
               handle_error("socket");

           memset(&my_addr, 0, sizeof(my_addr));
           my_addr.sun_family = AF_UNIX;
           strncpy(my_addr.sun_path, MY_SOCK_PATH,
                   sizeof(my_addr.sun_path) - 1);

           if (bind(sfd, (struct sockaddr *) &my_addr,
                    sizeof(my_addr)) == -1)
               handle_error("bind");

           if (listen(sfd, LISTEN_BACKLOG) == -1)
               handle_error("listen");

           /* Teraz możemy akceptować nadchodzące połączenia,
              po jednym naraz, za pomocą accept(2). */

           peer_addr_size = sizeof(peer_addr);
           cfd = accept(sfd, (struct sockaddr *) &peer_addr,
                        &peer_addr_size);
           if (cfd == -1)
               handle_error("accept");

           /* Kod do obsługi nadchodzących połączeń... */

           if (close(sfd) == -1)
               handle_error("close");

           if (unlink(MY_SOCK_PATH) == -1)
               handle_error("unlink");
       }

ZOBACZ TAKŻE

       accept(2),   connect(2),    getsockname(2),    listen(2),    socket(2),    getaddrinfo(3),
       getifaddrs(3), ip(7), ipv6(7), path_resolution(7), socket(7), unix(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⟩.