bind(2) System Calls Manual bind(2) BEZEICHNUNG bind - verbindet einen Namen mit einem Socket BIBLIOTHEK Standard-C-Bibliothek (libc, -lc) UBERSICHT #include int bind(int sockdd, const struct sockaddr *adr, socklen_t adrlange); BESCHREIBUNG Wenn ein Socket mit socket(2) erstellt wird, existiert er in einem Namensraum (Adressfamilie), ihm wurde aber noch keine Adresse zugewiesen. bind() weist die von adr angegebene Adresse dem Socket zu, auf den der Dateideskriptor sockdd weist. adrlange gibt die Grosse der durch adr bestimmten Adress-Struktur in Byte an. Traditionell wird diese Operation als >>Zuweisen eines Namens zu einem Socket<< bezeichnet. Es ist normalerweise notwendig, eine lokale Adresse mittels bind() zuzuweisen, bevor ein SOCK_STREAM-Socket Verbindungen annehmen kann (siehe accept(2)). Die verwendeten Regeln fur die Bindung/Zuweisung von Namen variieren zwischen den Adressfamilien. Ziehen Sie fur detaillierte Informationen die Handbuch-Eintrage in Abschnitt 7 zu Rate. Fur AF_INET siehe ip(7), fur AF_INET6 siehe ipv6(7), fur AF_UNIX siehe unix(7), fur AF_APPLETALK siehe ddp(7), fur AF_PACKET siehe packet(7), fur AF_X25 siehe x25(7) und fur AF_NETLINK siehe netlink(7). Die tatsachlich fur das adr-Argument ubergebene Struktur wird von der Adressfamilie abhangen. Die sockaddr-Struktur ist ungefahr wie folgt definiert: struct sockaddr { sa_family_t sa_family; char sa_data[14]; } Der einzige Zweck dieser Struktur ist die Typumwandlung des in adr ubergebenen Zeigers, um Compiler-Warnungen zu vermeiden (siehe die folgenden BEISPIELE). RUCKGABEWERT Bei Erfolg wird Null zuruckgegeben. Bei einem Fehler wird -1 zuruckgegeben und errno gesetzt, um den Fehler anzuzeigen. FEHLER EACCES Die Adresse ist geschutzt und der Benutzer ist nicht der Super-User. EADDRINUSE Die angegebene Adresse wird schon verwendet. EADDRINUSE (Internet-Domain-Sockets) Die Portnummer wurde in der Socket-Adressstruktur als Null angegeben, aber beim Versuch, einen fluchtigen Port zu binden, wurde festgestellt, dass alle Portnummern im fluchtigen Port-Bereich in Benutzung sind. Siehe die Erlauterungen zu /proc/sys/net/ipv4/ip_local_port_range ip(7). EBADF sockdd ist kein zulassiger Dateideskriptor. EINVAL Der Socket ist schon an eine Adresse gebunden. EINVAL adrlange ist falsch oder adr ist keine gultige Adresse fur die Domain des Sockets. ENOTSOCK Der Dateideskriptor sockdd zeigt nicht auf ein Socket. Die folgenden Fehlermeldungen sind spezifisch fur UNIX Domain Sockets (AF_UNIX): EACCES Eine Komponente des Pfad-Prafix darf nicht durchsucht werden. (Siehe auch path_resolution(7).) EADDRNOTAVAIL Es wurde eine nicht vorhandene Schnittstelle angefordert oder die Adresse war keine lokale Adresse. EFAULT adr zeigt aus dem vom Benutzer adressierbaren Adressraum heraus. ELOOP Bei der Auflosung von adr wurden zu viele symbolische Verknupfungen gefunden. ENAMETOOLONG adr ist zu lang. ENOENT Eine Komponente in dem Verzeichnisprafix des Socket-Pfadnames existiert nicht. ENOMEM Es war nicht genugend Kernelspeicher verfugbar. ENOTDIR Eine Komponente des Pfad-Prafixes ist kein Verzeichnis. EROFS Der Inode des Sockets wurde sich auf einem nur lesbaren (read-only) Dateisystem befinden. STANDARDS POSIX.1-2008. GESCHICHTE POSIX.1-2001, SVr4, 4.4BSD (bind() erschien zuerst in 4.2BSD). FEHLER Die transparenten Proxy-Optionen sind nicht beschrieben. BEISPIELE Ein Beispiel fur die Verwendung von bind() mit Internet Domain Sockets finden Sie in getaddrinfo(3). Das folgende Beispiel zeigt, wie ein Stream Socket in die UNIX-Domain (AF_UNIX) eingebunden wird und Verbindungen annimmt: #include #include #include #include #include #include #define MY_SOCK_PATH "/ein_Pfad" #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"); /* Nun konnen wir eingehende Verbindungen (nicht gleichzeitig) mittels accept(2) annehmen. */ peer_addr_size = sizeof(peer_addr); cfd = accept(sfd, (struct sockaddr *) &peer_addr, &peer_addr_size); if (cfd == -1) handle_error("accept"); /* Code fur den Umgang mit eingehenden Verbindungen */ if (close(sfd) == -1) handle_error("close"); if (unlink(MY_SOCK_PATH) == -1) handle_error("unlink"); } SIEHE AUCH 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) UBERSETZUNG Die deutsche Ubersetzung dieser Handbuchseite wurde von Hanno Wagner , Martin Eberhard Schauer und Mario Blattermann erstellt. Diese Ubersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezuglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG ubernommen. Wenn Sie Fehler in der Ubersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die Mailingliste der Ubersetzer . Linux man-pages 6.06 31. Oktober 2023 bind(2)