Manpages

BEZEICHNUNG

connect - eine Verbindung mit einem Socket starten

ÜBERSICHT

#include <sys/types.h> /* Siehe ANMERKUNGEN */
#include <sys/socket.h>

int connect(int sockfd, const struct sockaddr *addr,
socklen_t
addrlen);

BESCHREIBUNG

Der Systemaufruf connect() verbindet das durch den Dateideskriptor sockfd referenzierte Socket mit der durch addr angegebenen Adresse. Das Argument addrlen legt die Größe von addr fest. Das Format der Adresse in addr wird durch den Adressraum des Sockets sockfd festgelegt; siehe socket(2) für weitere Details.

Falls das Socket sockfd vom Typ SOCK_DGRAM ist, dann werden Datagramme standardmäßig an die Adresse addr 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 addr 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 Kernel 2.2 unterstützt).

RÜCKGABEWERT

Falls die Verbindung oder das Anbinden gelingt, wird Null zurückgeliefert. Im Fehlerfall wird -1 zurückgeliefert und errno entsprechend gesetzt.

FEHLER

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 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 sockfd 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

sockfd 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 sockfd 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.

KONFORM ZU

POSIX.1-2001, POSIX.1-2008, SVr4, 4.4BSD, (connect() erschien erstmalig in 4.2BSD).

ANMERKUNGEN

POSIX.1 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.

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.

BEISPIELE

Ein Beispiel für die Verwendung von connect() wird in getaddrinfo(3) vorgestellt.

SIEHE AUCH

accept(2), bind(2), getsockname(2), listen(2), socket(2), path_resolution(7), selinux(8)

KOLOPHON

Diese Seite ist Teil der Veröffentlichung 5.07 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 https://www.kernel.org/doc/man-pages/.

ÜBERSETZUNG

Die deutsche Übersetzung dieser Handbuchseite wurde von Martin Eberhard Schauer <Martin.E.Schauer [AT] gmx.de> und Helge Kreutzmann <debian [AT] helgefjell.de> 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 [AT] lists.org>.