Bindesubroutine

Zweck

Bindet einen Namen an einen Socket.

Bibliothek

Standard-C-Bibliothek (libc.a)

Syntax

#include <sys/socket.h>
int bind ( Socket,  Name,  NameLength)
int Socket;
const struct sockaddr *Name;
socklen_t NameLength;

Beschreibung

Die Subroutine Binden ordnet einem nicht benannten Socket einen Parameter Name zu. Sockets, die von der Subroutine Socket erstellt werden, sind nicht benannt. Sie werden nur durch ihre Adressfamilie identifiziert. Subroutinen, die Sockets verbinden, weisen entweder Namen zu oder verwenden nicht benannte Sockets.

Bei einem UNIX-Domain-Socket ist ein connect-Aufruf nur dann erfolgreich, wenn der Prozess, der connect aufruft, Lese- und Schreibrechte für die durch den bind-Aufruf erstellte Socket-Datei hat. Berechtigungen werden durch den umfragen -Wert des Prozesses bestimmt, der die Datei erstellt hat.

Ein Anwendungsprogramm kann den zugeordneten Socketnamen mit der Subroutine 'getsockname' abrufen.

Die Socketanwendungen können mit COMPAT_43 -Definition kompiliert werden. Dadurch ist die sockaddr -Struktur BSD 4.3 kompatibel. Weitere Informationen finden Sie in der Datei socket.h .

Durch das Binden eines Namens in der Domäne UNIX wird ein Socket im Dateisystem erstellt, der vom Aufrufenden gelöscht werden muss, wenn er nicht mehr benötigt wird.

Anmerkung: Wenn Sie IPv6 für eine Anwendung aktivieren, werden auch IPv4 -Adressen unterstützt. Sie können ein AF_INET6 -Socket verwenden, um sowohl IPv4 -als auch IPv6 -Pakete zu senden und zu empfangen, da AF_INET6 -Sockets in der Lage sind, die Kommunikation mit IPv4 -und IPv6 -Hosts zu handhaben. Sie müssen jedoch das Adressformat der IPv4 -Adressen, die zuvor an die Socketaufrufe übergeben wurden, in das IPv4-mapped IPv6 -Adressformat konvertieren. Beispielsweise müssen Sie 10.1.1.1 in der Struktur sockaddr_in in ::ffff:10.1.1.1 in der Struktur sockaddr_in6 konvertieren.

Parameter

Element Beschreibung
Socket Gibt den Socketdeskriptor (eine ganze Zahl) des zu bindenden Sockets an.
Name Verweist auf eine Adressstruktur, die die Adresse angibt, an die der Socket gebunden werden soll Die Datei /usr/include/sys/socket.h definiert die Adressstruktur sockaddr . Die Struktur Sockadr enthält eine Kennung, die für das Adressformat und das Protokoll spezifisch ist, die in der Subroutine Socket bereitgestellt werden.
NameLength Gibt die Länge der Socket-Adressstruktur an.

Rückgabewerte

Nach erfolgreicher Beendigung gibt die Subroutine Binden den Wert 0 zurück.

Wenn die Subroutine Binden nicht erfolgreich ist, führt der Subroutinenhandler die folgenden Aktionen aus:

  • Gibt einen Wert von -1 an das aufrufende Programm zurück.
  • Verschiebt einen Fehlercode, der den spezifischen Fehler angibt, in die globale Variable Fehlernummer . Weitere Erläuterungen zur Variablen Fehlernummer finden Sie unter "Error Notification Object Class" in Konzepte Der Kommunikationsprogrammierung.

Fehlercodes

Die Subroutine Binden ist nicht erfolgreich, wenn einer der folgenden Fehler auftritt:

Wert Beschreibung
EACCES Die angeforderte Adresse ist geschützt und der aktuelle Benutzer hat keine Zugriffsberechtigung.
EADDRINUSE Die angegebene Adresse wird bereits verwendet.
EADDRNOTAVAIL Die angegebene Adresse ist auf der lokalen Maschine nicht verfügbar.
EAFNOUNTERSTÜTZUNG Die angegebene Adresse ist keine gültige Adresse für die Adressfamilie des angegebenen Sockets.
EAGAIN Die transienten Ports sind bereits belegt und nicht verfügbar.
EBADF Der Parameter Socket ist ungültig.
EDESTADDRREQ Das Argument Adresse ist ein Nullzeiger.
EFAULT Der Parameter Adresse befindet sich nicht in einem beschreibbaren Teil des UserAddress .
EINVAL Der Socket ist bereits an eine Adresse gebunden.
ENOBUF Nicht genügend Pufferspeicher verfügbar.
ENODEV Die angegebene Einheit ist nicht vorhanden.
ENOTSOCK (ENOTSOCK) Der Parameter Socket verweist auf eine Datei, nicht auf einen Socket.
EOPNOTSUPP Das Socket, auf das der Parameter Socket verweist, unterstützt keine Adressbindung.

Beispiele

Das folgende Programmfragment veranschaulicht die Verwendung der Subroutine Binden zum Binden des Namens "/tmp/zan/" zu einem UNIX -Domänensocket.

#include <sys/un.h>
.
.
.
struct sockaddr_un addr;
.
.
.
strcpy(addr.sun_path, "/tmp/zan/");
addr.sun_len = strlen(addr.sun_path);
addr.sun_family = AF_UNIX; 
bind(s,(struct sockaddr*)&addr, SUN_LEN(&addr));