connect - eine Verbindung mit einem Socket starten
Standard-C-Bibliothek (libc, -lc)
ÜBERSICHT
#include <sys/socket.h>
int connect(int Sockdd, const struct sockaddr *Adr,
socklen_t Adrlän);
Der Systemaufruf connect() verbindet das durch den
Dateideskriptor Sockdd referenzierte Socket mit der durch Adr
angegebenen Adresse. Das Argument Adrlän legt die
Größe von Adr fest. Das Format der Adresse in
Adr wird durch den Adressraum des Sockets Sockdd festgelegt;
siehe socket(2) für weitere Details.
Falls das Socket Sockdd vom Typ SOCK_DGRAM ist, dann
werden Datagramme standardmäßig an die Adresse Adr
gesendet werden und auch nur von dieser Adresse empfangen. Falls das Socket
vom Typ SOCK_STREAM oder SOCK_SEQPACKET ist, versucht dieser
Aufruf eine Verbindung mit dem Socket herzustellen das an die angebene
Adresse Adr gebunden ist.
Sockets für einige Protokolle (z.B.
UNIX-Domain-Datenstrom-Sockets) können nur einmal erfolgreich
connect() durchführen.
Sockets für einige Protokolle (z.B. Datagram-Sockets in den
UNIX- und Internet-Domains) können connect() mehrfach
verwenden, um ihre Zuordnung zu ändern.
Sockets für einige Protokolle (z.B. TCP-Sockets sowie
Datagram-Sockets in den UNIX- und Internet-Domains) können ihre
Zuordnung lösen, indem sie mit einer Adresse verbinden, wobei das
Mitglied sa_family von sockaddr auf AF_UNSPEC gesetzt
ist. Danach kann sich der Socket mit einer anderen Adresse verbinden
(AF_UNSPEC wird unter Linux seit Version 2.2 unterstützt).
Falls die Verbindung oder das Anbinden gelingt, wird Null
zurückgeliefert. Im Fehlerfall wird -1 zurückgeliefert und
errno gesetzt, um den Fehler anzuzeigen.
Die folgenden Fehler sind nur allgemeine Socket-Fehler. Es mag
andere, domänenspezifische Fehlercodes geben.
- EACCES
- Für UNIX-Domain-Sockets, die durch einen Pfadnamen identifiziert
werden: Auf die Socket-Datei wurde das Schreiben nicht gestattet oder das
Suchen in einer der Dateien des Pfad-Präfixes wurde verwehrt (siehe
auch path_resolution(7)).
- EACCES,
EPERM
- Der Benutzer versuchte eine Verbindung zu einer Broadcast-Adresse, ohne
den Socket-Broadcast-Schalter aktiviert zu haben oder die
Verbindungsanfrage scheiterte wegen einer lokalen Firewall-Regel.
- EACCES
- Es kann auch zurückgegeben werden, falls eine SELinux-Richtlinie
eine Verbindung verweigerte (falls es beispielsweise eine Richtlinie gibt,
die regelt, dass ein HTTP-Proxy sich nur mit Ports verbinden kann, die
einem HTTP-Server zugeordnet sind, und der Proxy versucht, sich auf einen
anderen Port zu verbinden).
- EADDRINUSE
- Die lokale Adresse ist bereits in Benutzung.
- EADDRNOTAVAIL
- (Internet Domain Sockets) Das durch sockdd referenzierte Socket war
bisher nicht an eine Adresse gebunden und beim Versuch, es an einen
kurzlebigen Port zu binden, wurde festgestellt, dass alle Portnummern in
dem Portbereich für kurzlebige Portnummern derzeit verwendet
werden. Lesen Sie die Erörterung von
/proc/sys/net/ipv4/ip_local_port_range in ip(7).
- EAFNOSUPPORT
- Die übergebene Adresse hatte nicht die korrekte Adressfamilie in
ihrem Feld sa_family.
- EAGAIN
- Für nicht blockierende UNIX-Domain-Sockets ist der Socket nicht
blockierend und die Verbindung kann nicht sofort vollzogen werden.
Für andere Socket-Familien gibt es unzureichende Einträge in
dem Routing-Zwischenspeicher.
- EALREADY
- Das Socket ist nicht blockierend und ein vorhergehender Verbindungsversuch
wurde noch nicht beendet.
- EBADF
- Sockdd ist kein zulässiger offener Dateideskriptor.
- ECONNREFUSED
- Ein connect() auf einem Stream-Socket fand keinen, der auf der
Adresse in der Ferne wartete.
- EFAULT
- Die Adresse der Socket-Struktur liegt außerhalb des Adressraums des
Benutzers.
- EINPROGRESS
- Der Socket ist nichtblockierend und die Verbindung kann nicht sofort
aufgebaut werden. (UNIX-Domain-Sockets schlagen stattessen mit
EAGAIN fehl.) Der Socket kann zum Schreiben ausgewählt
werden und mittels select(2) oder poll(2) die erfolgreiche
Verbindung abgefragt werden. Nachdem select(2) die Beschreibbarkeit
anzeigt, lesen Sie mit getsockopt(2) die SO_ERROR-Option auf
der Ebene SOL_SOCKET, um festzustellen, ob connect()
erfolgreich (SO_ERROR ist Null) oder erfolglos (SO_ERROR ist
einer der üblichen hier aufgeführten Fehlercodes, welche die
Gründe für das Scheitern angeben) abgeschlossen wurde.
- EINTR
- Der Systemaufruf wurde durch ein abgefangenes Signal unterbrochen; siehe
signal(7).
- EISCONN
- Der Socket ist bereits verbunden.
- ENETUNREACH
- Das Netz ist nicht erreichbar.
- ENOTSOCK
- Der Dateideskriptor sockdd zeigt nicht auf ein Socket.
- EPROTOTYPE
- Die Socket-Art unterstützt das angefragte Kommunikationsprotokoll
nicht. Dieser Fehler kann beispielsweise bei dem Versuch auftreten, ein
UNIX-Domain-Datagramm-Socket mit einem Stream-Socket zu verbinden.
- ETIMEDOUT
- Zeitüberschreitung (timeout) während des versuchten
Verbindungsaufbaus. Der Server ist vielleicht zu beschäftigt, um
neue Verbindungen aufzubauen. Beachten Sie, dass für IP-Sockets das
Timeout sehr lang sein kann, wenn auf dem Server
»Syncookies« aktiviert sind.
POSIX.1-2001, POSIX.1-2008, SVr4, 4.4BSD, (connect()
erschien erstmalig in 4.2BSD).
Für Hintergrundinformationen zum Typ socklen_t siehe
accept(2).
Falls connect() fehlschlägt, sollten Sie den Zustand
des Sockets als unspezifiziert ansehen. Portable Anwendungen sollten das
Socket schließen und ein neues für die Wiederverbindung
erstellen.
Ein Beispiel für die Verwendung von connect() wird
in getaddrinfo(3) vorgestellt.
ÜBERSETZUNG
Die deutsche Übersetzung dieser Handbuchseite wurde von
Martin Eberhard Schauer <Martin.E.Schauer@gmx.de>, Helge Kreutzmann
<debian@helgefjell.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.