Scroll to navigation

BIND(2) Linux-Programmierhandbuch BIND(2)

BEZEICHNUNG

bind - verbindet einen Namen mit einem Socket

ÜBERSICHT

#include <sys/types.h>          /* Siehe ANMERKUNGEN */
#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

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 addr angegebene Adresse dem Socket zu, auf den der Dateideskriptor sockfd weist. addrlen gibt die Größe der durch addr 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 addr-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 addr übergebenen Zeigers, um Compiler-Warnungen zu vermeiden (siehe das folgende BEISPIEL).

RÜCKGABEWERT

Bei Erfolg wird Null zurückgegeben. Bei einem Fehler wird -1 zurückgegeben und errno entsprechend gesetzt.

FEHLER

EACCES
Die Adresse ist geschützt und der Benutzer ist nicht der Super-User.
EADDRINUSE
Die angegebene Adresse wird schon verwendet.
EADDRINUSE
(Internet domain sockets) The port number was specified as zero in the socket address structure, but, upon attempting to bind to an ephemeral port, it was determined that all port numbers in the ephemeral port range are currently in use. See the discussion of /proc/sys/net/ipv4/ip_local_port_range ip(7).
EBADF
sockfd ist kein zulässiger Deskriptor.
EINVAL
Der Socket ist schon an eine Adresse gebunden.
EINVAL
addrlen is wrong, or addr is not a valid address for this socket's domain.
ENOTSOCK
sockfd ist ein Deskriptor für eine Datei, nicht für ein Socket.
Die folgenden Fehlermeldungen sind spezifisch für UNIX Domain Sockets (AF_UNIX):
EACCES
Eine Komponente des Pfad-Präfix 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
addr zeigt aus dem vom Benutzer adressierbaren Adressraum heraus.
ELOOP
Bei der Auflösung von addr wurden zu viele symbolische Verknüpfungen gefunden.
ENAMETOOLONG
addr ist zu lang.
ENOENT
Die Datei existiert nicht.
ENOMEM
Es war nicht genügend Kernel-Speicher verfügbar.
ENOTDIR
Eine Komponente des Pfad-Präfixes ist kein Verzeichnis.
EROFS
Der Inode des Sockets würde sich auf einem nur lesbaren (read-only) Dateisystem befinden.

KONFORM ZU

SVr4, 4.4BSD, POSIX.1-2001 ( bind() erschien erstmals in 4.2BSD).

ANMERKUNGEN

POSIX.1-2001 erfordert nicht, dass <sys/types.h> eingebunden wird. Diese Header-Datei ist in Linux nicht erforderlich. Allerdings benötigen einige historische Implementierungen (BSD) diese Header-Datei. Es wird empfohlen, sie für portierbare Anwendungen einzubinden.
Das dritte Argument von bind() ist in Wirklichkeit ein int (und so ist es auch in 4.x BSD, Libc4 und Libc5). Einige POSIX-Verwirrung führte zum gegenwärtigen socklen_t, das auch von Glibc verwendet wird (siehe auch accept(2)).

FEHLER

Die transparenten Proxy-Optionen sind nicht beschrieben.

BEISPIEL

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 <sys/socket.h>
#include <sys/un.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define MY_SOCK_PATH "/somepath" #define LISTEN_BACKLOG 50
#define handle_error(msg) \ do { perror(msg); exit(EXIT_FAILURE); } while (0)
int main(int argc, char *argv[]) { int sfd, cfd; struct sockaddr_un my_addr, peer_addr; socklen_t peer_addr_size;
sfd = socket(AF_UNIX, SOCK_STREAM, 0); if (sfd == -1) handle_error("socket");
memset(&my_addr, 0, sizeof(struct sockaddr_un)); /* Struktur zurücksetzen */ 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(struct sockaddr_un)) == -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(struct sockaddr_un); cfd = accept(sfd, (struct sockaddr *) &peer_addr, &peer_addr_size); if (cfd == -1) handle_error("accept");
/* Code für die Behandlung eingehender Verbindungen ... */
/* Wenn er nicht mehr gebraucht wird, sollte der Pfadname des Sockets (MY_SOCK_PATH) mit unlink(2) oder remove(3) gelöscht werden */ }

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)

KOLOPHON

Diese Seite ist Teil der Veröffentlichung 3.74 des Projekts Linux- man-pages. Eine Beschreibung des Projekts, Informationen, wie Fehler gemeldet werden können sowie die aktuelle Version dieser Seite finden sich unter http://www.kernel.org/doc/man-pages/.

ÜBERSETZUNG

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 <debian-l10n-german@lists.debian.org>.
19. August 2014 Linux