bind(2) System Calls Manual bind(2) NAZWA bind - przywiazuje nazwe do gniazda BIBLIOTEKA Standardowa biblioteka C (libc, -lc) SKLADNIA #include int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen); OPIS Gdy tworzone jest gniazdo za pomoca socket(2), istnieje ono w przestrzeni nazw (rodzinie adresow), lecz nie ma przypisanego adresu. bind() przypisuje adres okreslony w addr do gniazda odnoszacego sie do deskryptora pliku sockfd. addrlen okresla rozmiar, w bajtach, struktury adresowej na ktora wskazuje addr. Tradycyjnie operacja ta byla nazywana "przypisaniem nazwy do gniazda". Normalnie, zanim gniazdo SOCK_STREAM bedzie moglo odbierac polaczenia (zobacz accept(2)), niezbedne jest przypisanie mu lokalnego adresu za pomoca bind(). Reguly dotyczace przywiazywania nazw sa rozne w roznych rodzinach adresow. Szczegolowe informacje znajduja sie na stronach podrecznika 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 bedzie zalezala od rodziny adresowej. Struktura sockaddr jest zdefiniowana podobnie do: struct sockaddr { sa_family_t sa_family; char sa_data[14]; } Jedyna funkcja tej struktury jest rzutowanie wskaznika struktury przekazanego w addr, aby uniknac ostrzezen kompilatora. Zob. PRZYKLADY ponizej. WARTOSC ZWRACANA Po pomyslnym zakonczeniu zwracane jest zero. Po bledzie zwracane jest -1 i ustawiane jest errno wskazujac blad. BLEDY EACCES Adres jest chroniony, a uzytkownik nie jest superuzytkownikiem. EADDRINUSE Podany adres juz jest wykorzystywany. EADDRINUSE (gniazda domeny Internet) Podano zero jako numer portu w strukturze adresu gniazda, lecz przy probie skojarzenia z portem dynamicznym (efemerycznym), okazalo sie, ze wszystkie numery portow w zakresie portow dynamicznych sa aktualnie uzywane. Wiecej informacji w opisie pliku /proc/sys/net/ipv4/ip_local_port_range w podreczniku ip(7). EBADF sockfd nie jest prawidlowym deskryptorem pliku. EINVAL Gniazdo jest juz skojarzone z adresem. EINVAL addrlen jest nieprawidlowe lub addr nie jest prawidlowym adresem dla tej domeny gniazda. ENOTSOCK Deskryptor pliku sockfd nie odnosi sie do gniazda. Nastepujace bledy odnosza sie do gniazd domeny UNIX-owej (AF_UNIX): EACCES Brak praw do przeszukiwania dla skladowej sciezki (zob. takze path_resolution(7)). EADDRNOTAVAIL Zazadano nieistniejacego interfejsu lub zadany adres nie jest adresem lokalnym. EFAULT addr wskazuje poza dostepna dla uzytkownika przestrzen adresowa. ELOOP Podczas rozwiazywania addr napotkano zbyt wiele dowiazan symbolicznych. ENAMETOOLONG addr jest zbyt dlugie. ENOENT Fragment sciezki gniazda odnoszacy sie do ktoregos z katalogow nie istnieje. ENOMEM Brak pamieci jadra. ENOTDIR Skladnik sciezki nie jest katalogiem. EROFS I-wezel gniazda rezyduje na systemie plikow przeznaczonym tylko do odczytu. STANDARDY POSIX.1-2008. HISTORIA POSIX.1-2001, SVr4, 4.4BSD (bind() pojawilo sie pierwotnie w 4.2BSD). USTERKI Nie opisano opcji przezroczystych proxy. PRZYKLADY Przykladowy program uzywajacy bind() z gniazdami domeny Internet mozna znalezc w getaddrinfo(3). Nastepujacy przyklad pokazuje sposob na skojarzenie gniazda strumieniowego w domenie uniksowej (AF_UNIX) i akceptowac polaczenia: #include #include #include #include #include #include #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 mozemy akceptowac nadchodzace polaczenia, po jednym naraz, za pomoca 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 obslugi nadchodzacych polaczen... */ if (close(sfd) == -1) handle_error("close"); if (unlink(MY_SOCK_PATH) == -1) handle_error("unlink"); } ZOBACZ TAKZE 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) TLUMACZENIE Autorami polskiego tlumaczenia niniejszej strony podrecznika sa: Przemek Borys , Andrzej Krzysztofowicz i Michal Kulach Niniejsze tlumaczenie jest wolna dokumentacja. Blizsze informacje o warunkach licencji mozna uzyskac zapoznajac sie z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje sie ZADNEJ ODPOWIEDZIALNOSCI. Bledy w tlumaczeniu strony podrecznika prosimy zglaszac na adres listy dyskusyjnej . Linux man-pages 6.06 31 pazdziernika 2023 r. bind(2)