#include <sys.types.h>
#include <sys.socket.h>
#include <netinet.in.h> /* nur bei AF_INET und AF_INET6 */
#include <iso.h> /* nur bei AF_ISO */
Kernighan-Ritchie-C:
int connect(s, name, namelen);
int s;
int namelen;
struct sockaddr_in *name; /* nur bei AF_INET */
struct sockaddr_in6 *name; /* nur bei AF_INET6 */
struct sockaddr_iso *name; /* nur bei AF_ISO */
ANSI-C:
int connect(int s, struct sockaddr* name, int namelen);
Beschreibung
Mit connect() initiiert eine Task über einen Socket s vom Typ SOCK_STREAM die Kommunikation mit einem Partner-Socket. Wenn der Partner-Socket vom Typ SOCK_DGRAM ist, wird die Partner-Information nur im Socket s abgelegt.
Der Parameter s bezeichnet den Socket, über den die Task die Kommunikation mit einem anderen Socket initiiert. name ist ein Zeiger auf die Adresse des Kommunikationspartners. Der Kommunikationspartner ist ein Socket, der der gleichen Adressfamilie angehört. In der Adressfamilie AF_ISO ist dies zwingend erforderlich.
Zwischen den Adressfamilien AF_INET und AF_INET6 ist mithilfe von IPv4-Mapped-IPv6-Adressen eine Kommunikation in beiden Richtungen möglich. Somit kann ein AF_INET-Socket auf einem Rechner, der nur IPv4-Adressen besitzt, eine Verbindung herstellen mit einen AF_INET6-Partnersocket auf einem Rechner, der teilweise oder ausschließlich IPv6-Adressen besitzt.
*name ist eine Adresse im Adressbereich des Sockets, zu dem die Verbindung initiiert werden soll. Jeder Adressbereich interpretiert den Parameter name auf seine eigene Art.namelen enthält die Länge (in Bytes) der Adresse des Kommunikationspartners.
Die Funktionalität von connect() wird im Detail durch die verwendete Adressfamilie festgelegt:
connect() bei AF_INET und AF_INET6
Je nachdem, ob es sich um einen Socket vom Typ SOCK_STREAM oder SOCK_DGRAM handelt, verfährt connect() unterschiedlich:
Bei einem Socket vom Typ SOCK_STREAM (Stream-Socket) sendet connect() eine Verbindungsanforderung an einen Partner und versucht so, eine Verbindung zu diesem Partner herzustellen. Der Partner wird durch den Parameter name spezifiziert. Mit connect() initiiert z.B. eine Client-Task über einen Stream-Socket eine Verbindung zu einem Server.
Generell können Stream-Sockets nur einmal eine Verbindung mit connect() herstellen.Bei einem Socket vom Typ SOCK_DGRAM (Datagramm-Socket) legt eine Task mit connect() den Namen des Kommunikationspartners (Parameter name) fest, mit dem der Datenaustausch erfolgen soll. An diesen Kommunikationspartner sendet die Task dann die Datagramme. Außerdem ist dieser Kommunikationspartner der einzige Socket, von dem die Task Datagramme empfangen kann.
Wird sowohl eine IP-Adresse als auch ein Port ungleich 0 angegeben, erzeugt das Transportsystem eine Route und ordnet dieser ein lokales Interface zu. Dieses lokale Interface kann mit getsockname() abgefragt werden.
Bei Datagramm-Sockets kann connect() mehrmals verwendet werden, um die Kommunikationspartner zu wechseln. Durch Angabe eines Null-Zeigers beim Parameter name kann die Zuordnung zu einem bestimmten Partner beendet werden.
connect() bei AF_ISO
Mit connect() wird die Verbindung zu einem ISO-Partner hergestellt. Der Partner muss die Verbindungsanforderung nicht nur mit accept() annehmen, sondern muss außerdem zur Bestätigung eine Übertragungsfunktion (send() oder sendmsg()) aufrufen, bei der allerdings nicht unbedingt Daten übertragen werden müssen. Dies lässt sich z.B. mit einem sendmsg()-Aufruf erreichen.
Auch hier kann die Verbindung zweier Endpunkte nur einmal durch connect() hergestellt werden.
Returnwert
0:
bei Erfolg
-1:
bei Fehler. errno wird gesetzt, um den Fehler anzuzeigen.
Fehleranzeige durch
errno
EADDRINUSE
Die angegebene Adresse wird bereits benutzt.
EAFNOSUPPORT
Adressen in der angegebenen Adressfamilie sind inkompatibel mit der Adressfamilie des Sockets.
EBADF
s ist kein gültiger Deskriptor.
ECONNREFUSED
Der Verbindungsversuch wurde zurückgewiesen. Der angeforderte Service war zum Zeitpunkt des Funktionsaufrufs vermutlich nicht verfügbar.
EFAULT
Die Länge des Bereichs für die Aufnahme der Adresse ist zu klein.
EINPROGRESS
Der Verbindungsaufbau wurde noch nicht erfolgreich beendet.
EISCONN
Der Socket hat bereits eine Verbindung.
ENETDOWN
Die Verbindung zum Netzwerk ist nicht mehr aktiv.
Hinweis
Wird die Verbindung mit einem nicht-blockierenden Socket vom Typ SOCK_STREAM aufgebaut (entweder mit soc_ioctl() NONBLOCKING gesetzt oder durch Nutzung einer externen Börse), kann es mit einer Anwendung, die mit Sockets >=
V2.6 produziert wurde, zu einem Returnwert -1 mit der errno EINPROGRESS kommen. Das bedeutet, dass die Verbindung zum Zeitpunkt der Rückgabe der Kontrolle an den Aufrufer noch nicht erfolgreich aufgebaut worden ist. Bevor dieser Socket benutzt wird, prüfen Sie daher mit select() oder soc_poll() die Schreibfähigkeit.
Wenn ein Schreib-/Lese-Zugriff erfolgt, bevor die Verbindung vollständig aufgebaut ist, wird dieser mit einem Returnwert -1 und der errno EWOULDBLOCK abgewiesen.
Siehe auch
accept(), getsockname() select(), soc_close(), socket()