table of contents
other languages
other sections
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)).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.
- EBADF
- sockfd ist kein gültiger Deskriptor.
- EINVAL
- Der Socket ist schon an eine Adresse gebunden.
- ENOTSOCK
- sockfd ist ein Deskriptor für eine Datei, nicht für ein Socket.
- 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.
- EINVAL
- Die addrlen war falsch oder der Socket gehörte nicht zur AF_UNIX-Familie.
- 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 zu wenig 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.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).#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.42 des Projekts Linux- man-pages. Eine Beschreibung des Projekts und Informationen, wie Fehler gemeldet werden können, 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> und Martin Eberhard Schauer <Martin.E.Schauer@gmx.de> erstellt.28. Dezember 2007 | Linux |