connect - eine Verbindung mit einem Socket starten
Standard-C-Bibliothek (
libc,
-lc)
#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.
accept(2),
bind(2),
getsockname(2),
listen(2),
socket(2),
path_resolution(7),
selinux(8)
Die deutsche Übersetzung dieser Handbuchseite wurde von Martin Eberhard
Schauer <
[email protected]>, Helge Kreutzmann
<
[email protected]> und Mario Blättermann
<
[email protected]> 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