Subroutine verbinden
Zweck
Verbindet zwei Sockets.
Bibliothek
Standard-C-Bibliothek (libc.a)
Syntax
#include <sys/socket.h>
int connect ( Socket, Name, NameLength )
int Socket;
const struct sockaddr *Name;
socklen_t NameLength;
Beschreibung
Die Subroutine connect fordert eine Verbindung zwischen zwei Sockets an. Der Kernel richtet die Kommunikationsverbindung zwischen den Sockets ein. Beide Sockets müssen dasselbe Adressformat und dasselbe Protokoll verwenden.
Wenn ein connect -Unterprogramm auf einem ungebundenen Socket oder einem teilweise gebundenen Socket ausgegeben wird, bindet das System den Socket automatisch. Ein teilweise gebundener Socket ist ein Socket, dem eine Portnummer, aber keine IP-Adresse zugewiesen ist. Das Unterprogramm connect kann verwendet werden, um eine Steckdose mit sich selbst zu verbinden. Eine Socket kann mit sich selbst verbunden werden, indem eine Socket an einen lokalen Port gebunden wird (mithilfe des bind -Unterprogramms) und dann mit demselben Port mit einer lokalen IP-Adresse verbunden wird (mithilfe des connect -Unterprogramms).
Die Subroutine connect führt für jede der folgenden zwei Arten von Initiierungssockets eine andere Aktion aus:
- Wenn der initiierende Socket SOCK_DGRAM ist, legt das Unterprogramm connect die Peer-Adresse fest. Die Peer-Adresse identifiziert den Socket, an den alle Datagramme in nachfolgenden send unterprogrammen Von diesem connect -Unterprogramm werden keine Verbindungen hergestellt. Wenn der UDP-Socket Datagramme empfängt, während das Unterprogramm connect aufgerufen wird, ändert das Unterprogramm die IP-Adresse und verhindert so, dass der Socket Datagramm-Pakete basierend auf der vorherigen Adresse empfängt.
- Wenn der initiierende Socket SOCK_STREAM oder SOCK_CONN_DGRAM ist, versucht die connect -Subroutine, eine Verbindung zu dem durch den Name-Parameter angegebenen Socket herzustellen. Jeder Kommunikationsraum interpretiert den Parameter "Name" anders. Bei SOCK_CONN_DGRAM-Socket-Typ und ATM-Protokoll kann die Gegenstelle einige der ATM-Parameter ändern. Wenn die Gegenstelle die ATM-Parameter ändert, können Anwendungen neue Werte der ATM-Parameter abfragen, indem sie die entsprechenden Socket-Optionen verwenden.
- Bei einem UNIX-Domain-Socket ist ein Aufruf von connect nur dann erfolgreich, wenn der Prozess, der das connect -Unterprogramm aufruft, über Lese- und Schreibberechtigungen für die Socket-Datei verfügt, die durch den Aufruf von bind erstellt wird. Berechtigungen werden durch den Wert von
umaskbestimmt, der dem Wert des Prozesses entspricht, mit dem die Datei erstellt wurde.
Parameter
| Element | Beschreibung |
|---|---|
| Socket | Gibt den eindeutigen Namen des Sockets an. |
| Name | Gibt die Adresse des Zielsockets an, der das andere Ende der Kommunikationsleitung bildet |
| NameLength | Gibt die Länge der Adressstruktur an. |
Rückgabewerte
Nach erfolgreicher Beendigung gibt die Subroutine connect den Wert 0 zurück.
Wenn das Unterprogramm connect nicht erfolgreich ist, führt der Systemhandler die folgenden Funktionen aus:
- Gibt einen Wert von -1 an das aufrufende Programm zurück.
- Verschiebt einen Fehlercode, der den spezifischen Fehler angibt, in die globale Variable
errno.
Fehlercodes
Die Subroutine connect ist nicht erfolgreich, wenn einer der folgenden Fehler auftritt:
| Wert | Beschreibung |
|---|---|
| EADDRINUSE | Die angegebene Adresse wird bereits verwendet. Dieser Fehler tritt auch auf, wenn die Socket-Option SO_REUSEADDR festgelegt wurde und die lokale Adresse (ob angegeben oder vom System ausgewählt) bereits verwendet wird. |
| EADDRNOTAVAIL | Die angegebene Adresse ist auf der lokalen Maschine nicht verfügbar. |
| EAFNOSUPPORT | Die Adressen in der angegebenen Adressfamilie können mit diesem Socket nicht verwendet werden. |
| BEREITS | Die Socket-Verbindung ist mit dem Flag O_NONBLOCK oder O_NDLAY gekennzeichnet und ein vorheriger Verbindungsversuch ist noch nicht abgeschlossen. |
| EINTR | Der Versuch, eine Verbindung herzustellen, wurde durch die Übermittlung eines Signals unterbrochen, das abgefangen wurde. Die Verbindung wird asynchron hergestellt. |
| EACCES | Die Suchberechtigung für eine Komponente des Pfadpräfix wird verweigert oder der Schreibzugriff auf das benannte Socket wird verweigert. |
| ENOBUFS | Das System hat keinen Speicher mehr für eine interne Datenstruktur. |
| EOPNOTSUPP | Der Socket, auf den sich der Socket-Parameter bezieht, unterstützt connect nicht. |
| WIR WÜRDEN BLOCKIEREN | Der Bereich, der für TCP/UDP-Ephemeral-Ports zugewiesen ist, ist erschöpft. |
| EBADF | Der Parameter Socket ist ungültig. |
| ECONNABGELEHNT | Der Versuch, eine Verbindung herzustellen, wurde zurückgewiesen. |
| EFAULT | Der Parameter Adresse befindet sich nicht in einem beschreibbaren Teil des Benutzeradressraums. |
| EINPROGRESS | Der Socket ist als nicht blockierend markiert. Die Verbindung kann nicht sofort hergestellt werden. Das Anwendungsprogramm kann das Socket zum Schreiben während des Verbindungsprozesses auswählen. |
| EINVAL | Dieser Fehler tritt in den folgenden Fällen auf:
|
| EISVerbindung (EISCONN) | Der Socket ist bereits verbunden. |
| INAKTIV | Das angegebene physische Netz ist inaktiv. |
| ENETUNREACH | Es ist kein Leitweg zum Netz oder Host vorhanden. |
| ENOSPC | Auf einem Gerät oder Systemtisch ist kein Platz mehr. |
| ENOTCONN | Die Steckdose ist möglicherweise nicht angeschlossen. |
| ENOTSOCK (ENOTSOCK) | Der Parameter Socket verweist auf eine Datei, nicht auf ein Socket. |
| ETIMEDOUT | Die Herstellung einer Verbindung hat das zulässige Zeitlimit überschritten, bevor eine Verbindung hergestellt wurde. |
| EPROTOTYP | Die angegebene Adresse hat einen anderen Typ als das Socket, das an die angegebene Peeradresse gebunden ist. |
| ELOOP | Beim Konvertieren des Pfadnamens in der Adresse wurden zu viele symbolische Verknüpfungen gefunden. |
| ENOENT | Eine Komponente des Pfadnamens gibt keine vorhandene Datei an oder der Pfadname ist eine leere Zeichenfolge. |
| ENOTDIR | Ein Bestandteil des Pfadpräfixes des Pfadnamens in der Adresse ist kein Verzeichnis. |
Beispiele
Das folgende Programmfragment veranschaulicht die Verwendung der Subroutine connect durch einen Client, um eine Verbindung zum Socket eines Servers herzustellen.
struct sockaddr_un server;
.
.
.
connect(s,(struct sockaddr*)&server, sun_len(&server));