bind(2) | System Calls Manual | bind(2) |
bind - verbindet einen Namen mit einem Socket
Standard-C-Bibliothek (libc, -lc)
#include <sys/socket.h>
int bind(int sockdd, const struct sockaddr *adr, socklen_t adrlänge);
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. adrlänge gibt die Größe 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 für die Bindung/Zuweisung von Namen variieren zwischen den Adressfamilien. Ziehen Sie für detaillierte Informationen die Handbuch-Einträge in Abschnitt 7 zu Rate. Für AF_INET siehe ip(7), für AF_INET6 siehe ipv6(7), für AF_UNIX siehe unix(7), für AF_APPLETALK siehe ddp(7), für AF_PACKET siehe packet(7), für AF_X25 siehe x25(7) und für AF_NETLINK siehe netlink(7).
Die tatsächlich für das adr-Argument übergebene Struktur wird von der Adressfamilie abhängen. Die sockaddr-Struktur ist ungefähr 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 übergebenen Zeigers, um Compiler-Warnungen zu vermeiden (siehe die folgenden BEISPIELE).
Bei Erfolg wird Null zurückgegeben. Bei einem Fehler wird -1 zurückgegeben und errno gesetzt, um den Fehler anzuzeigen.
Die folgenden Fehlermeldungen sind spezifisch für UNIX Domain Sockets (AF_UNIX):
POSIX.1-2001, POSIX.1-2008, SVr4, 4.4BSD (bind() erschien erstmals in 4.2BSD).
Für Hintergrundinformationen zum Typ socklen_t siehe accept(2).
Die transparenten Proxy-Optionen sind nicht beschrieben.
Ein Beispiel für 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 <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"); /* Jetzt können wir eingehende Verbindungen nacheinander mit 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 für die Behandlung eingehender Verbindungen … */ if (close(sfd) == -1) handle_error("close"); if (unlink(MY_SOCK_PATH) == -1) handle_error("unlink"); }
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)
Die deutsche Übersetzung dieser Handbuchseite wurde von Hanno Wagner <wagner@bidnix.bid.fh-hannover.de>, Martin Eberhard Schauer <Martin.E.Schauer@gmx.de> und Mario Blättermann <mario.blaettermann@gmail.com> erstellt.
Diese Übersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezüglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen.
Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die Mailingliste der Übersetzer.
5. Februar 2023 | Linux man-pages 6.03 |