connect-Funktion (winsock2.h)

Die Connect-Funktion stellt eine Verbindung mit einem angegebenen Socket her.

Syntax

int WSAAPI connect(
  [in] SOCKET         s,
  [in] const sockaddr *name,
  [in] int            namelen
);

Parameter

[in] s

Ein Deskriptor, der einen nicht verbundenen Socket identifiziert.

[in] name

Ein Zeiger auf die sockaddr-Struktur , mit der die Verbindung hergestellt werden soll.

[in] namelen

Die Länge der sockaddr-Struktur in Bytes, auf die der name-Parameter verweist.

Rückgabewert

Wenn kein Fehler auftritt, gibt connect null zurück. Andernfalls wird SOCKET_ERROR zurückgegeben, und ein bestimmter Fehlercode kann durch Aufrufen von WSAGetLastError abgerufen werden.

Bei einem blockierenden Socket gibt der Rückgabewert den Erfolg oder Fehler des Verbindungsversuchs an.

Bei einem nicht blockierenden Socket kann der Verbindungsversuch nicht sofort abgeschlossen werden. In diesem Fall gibt connect SOCKET_ERROR zurück, und WSAGetLastError gibt WSAEWOULDBLOCK zurück. In diesem Fall gibt es drei mögliche Szenarien:

  • Verwenden Sie die Select-Funktion , um den Abschluss der Verbindungsanforderung zu bestimmen, indem Sie überprüfen, ob der Socket schreibbar ist.
  • Wenn die Anwendung WSAAsyncSelect verwendet, um Interesse an Verbindungsereignissen anzuzeigen, erhält die Anwendung eine FD_CONNECT Benachrichtigung, die angibt, dass der Verbindungsvorgang abgeschlossen ist (erfolgreich oder nicht).
  • Wenn die Anwendung WSAEventSelect verwendet, um Interesse an Verbindungsereignissen anzuzeigen, wird dem zugeordneten Ereignisobjekt signalisiert, dass der Verbindungsvorgang abgeschlossen ist (erfolgreich oder nicht).

Bis der Verbindungsversuch auf einem nicht blockierenden Socket abgeschlossen ist, schlagen alle nachfolgenden Aufrufe zur Verbindung mit demselben Socket mit dem Fehlercode WSAEALREADY und WSAEISCONN fehl, wenn die Verbindung erfolgreich abgeschlossen wurde. Aufgrund von Mehrdeutigkeiten in Version 1.1 der Windows Sockets-Spezifikation können Fehlercodes, die von der Verbindung zurückgegeben werden, während eine Verbindung bereits aussteht, je nach Implementierung variieren. Daher wird davon abgeraten, dass Anwendungen mehrere Aufrufe zum Herstellen einer Verbindung verwenden, um den Verbindungsabschluss zu erkennen. Wenn sie dies tun, müssen sie bereit sein, WSAEINVAL - und WSAEWOULDBLOCK-Fehlerwerte auf die gleiche Weise wie WSAEALREADY zu behandeln, um einen stabilen Betrieb zu gewährleisten.

Wenn der zurückgegebene Fehlercode angibt, dass der Verbindungsversuch fehlgeschlagen ist (d. h. WSAECONNREFUSED, WSAENETUNREACH, WSAETIMEDOUT), kann die Anwendung die Verbindung für denselben Socket erneut aufrufen.

Fehlercode Bedeutung
WSANOTINITIALISIERT
Vor der Verwendung dieser Funktion muss ein erfolgreicher WSAStartup-Aufruf erfolgen.
WSAENETDOWN
Fehler beim Netzwerksubsystem.
WSAEADDRINUSE
Die lokale Adresse des Sockets wird bereits verwendet, und der Socket wurde nicht markiert, um die Wiederverwendung von Adressen mit SO_REUSEADDR zu ermöglichen. Dieser Fehler tritt normalerweise beim Ausführen der Bindung auf, kann jedoch bis zur Verbindungsfunktion verzögert werden, wenn die Bindung an eine Wildcardadresse (INADDR_ANY oder in6addr_any) für die lokale IP-Adresse erfolgte. Eine bestimmte Adresse muss implizit durch die Connect-Funktion gebunden werden.
WSAEINTR
Der blockierende Windows Socket 1.1-Aufruf wurde über WSACancelBlockingCall abgebrochen.
WSAEINPROGRESS
Ein blockierter Windows Sockets 1.1-Aufruf wird ausgeführt, oder der Dienstanbieter verarbeitet noch eine Rückruffunktion.
WSAEALREADY
Ein nicht blockierender Verbindungsaufruf wird für den angegebenen Socket ausgeführt.
Hinweis Um die Abwärtskompatibilität aufrechtzuerhalten, wird dieser Fehler als WSAEINVAL an Windows Sockets 1.1-Anwendungen gemeldet, die entweder mit Winsock.dll oder Wsock32.dll verknüpft sind.
 
WSAEADDRNOTAVAIL
Die Remoteadresse ist keine gültige Adresse (z. B. INADDR_ANY oder in6addr_any).
WSAEAFNOSUPPORT
Adressen in der angegebenen Adressfamilie können nicht mit diesem Socket verwendet werden.
WSAECONNREFUSED
Die Zurückweisung des Verbindungsversuchs wurde erzwungen.
WSAEFAULT
Die sockaddr-Struktur , auf die der Name verweist, enthält ein falsches Adressformat für die zugeordnete Adressfamilie, oder der namelen-Parameter ist zu klein. Dieser Fehler wird auch zurückgegeben, wenn sich die sockaddr-Struktur , auf die der name-Parameter mit einer im parameter namelen angegebenen Länge zeigt, nicht in einem gültigen Teil des Benutzeradressraums befindet.
WSAEINVAL
Der Parameter s ist ein Lauschsocket.
WSAEISCONN
Der Socket ist bereits verbunden (nur verbindungsorientierte Sockets).
WSAENETUNREACH
Das Netzwerk kann von diesem Host zurzeit nicht erreicht werden.
WSAEHOSTUNREACH
Versuch eines Socketvorgangs für einen nicht erreichbaren Host.
WSAENOBUFS
Hinweis Es ist kein Pufferspeicher verfügbar. Der Socket kann nicht verbunden werden.
 
WSAENOTSOCK
Der im s-Parameter angegebene Deskriptor ist kein Socket.
WSAETIMEDOUT
Bei einem Verbindungsversuch ist ein Timeout ohne Verbindungsherstellung erfolgt.
WSAEWOULDBLOCK
Der Socket ist als nicht blockierend gekennzeichnet, und die Verbindung kann nicht sofort hergestellt werden.
WSAEACCES
Beim Versuch, einen Datagrammsocket mit der Broadcastadresse zu verbinden, ist ein Fehler aufgetreten, da die Option setsockopt SO_BROADCAST nicht aktiviert ist.

Hinweise

Die Connect-Funktion wird verwendet, um eine Verbindung mit dem angegebenen Ziel herzustellen. Wenn Socket s ungebunden ist, werden der lokalen Zuordnung vom System eindeutige Werte zugewiesen, und der Socket wird als gebunden markiert.

Für verbindungsorientierte Sockets (z. B. Typ SOCK_STREAM) wird eine aktive Verbindung mit dem fremden Host unter Verwendung des Namens initiiert (eine Adresse im Namespace des Sockets; eine ausführliche Beschreibung finden Sie unter bind und sockaddr).

Hinweis Wenn ein Socket geöffnet wird, wird ein setsockopt-Aufruf ausgeführt, und dann wird ein sendto-Aufruf ausgeführt, Windows Sockets führt einen impliziten Bindungsfunktionsaufruf aus.

 

Wenn der Socketaufruf erfolgreich abgeschlossen wurde, ist der Socket bereit, Daten zu senden und zu empfangen. Wenn der Adressmember der durch den Parameter name angegebenen Struktur mit Nullen gefüllt ist, gibt connect den Fehler WSAEADDRNOTAVAIL zurück. Jeder Versuch, eine aktive Verbindung wiederherzustellen, schlägt mit dem Fehlercode WSAEISCONN fehl.

Bei verbindungsorientierten, nicht blockierenden Sockets ist es oft nicht möglich, die Verbindung sofort abzuschließen. In diesem Fall gibt diese Funktion den Fehler WSAEWOULDBLOCK zurück. Der Vorgang wird jedoch fortgesetzt.

Wenn das Erfolgs- oder Fehlerergebnis bekannt wird, kann es auf eine von zwei Arten gemeldet werden, je nachdem, wie sich der Client für die Benachrichtigung registriert.

  • Wenn der Client die Select-Funktion verwendet, wird der Erfolg in der writefds-Gruppe und fehler im exceptfds-Satz gemeldet.
  • Wenn der Client die Funktionen WSAAsyncSelect oder WSAEventSelect verwendet, wird die Benachrichtigung mit FD_CONNECT angekündigt, und der dem FD_CONNECT zugeordnete Fehlercode gibt entweder erfolg oder einen bestimmten Fehlergrund an.

Wenn die Verbindung nicht sofort abgeschlossen wird, sollte der Client auf den Verbindungsabschluss warten, bevor versucht wird, Socketoptionen mithilfe von setsockopt festzulegen. Das Aufrufen von setsockopt, während eine Verbindung hergestellt wird, wird nicht unterstützt.

Für einen verbindungslosen Socket (z. B. typisiert SOCK_DGRAM) dient der von connect ausgeführte Vorgang lediglich zum Einrichten einer Standardzieladresse, die für nachfolgendeWSASend/ - und recv / WSARecv-Aufrufe verwendet werden kann. Alle Datagramme, die von einer anderen Adresse als der angegebenen Zieladresse empfangen werden, werden verworfen. Wenn der Adressmember der durch den Namen angegebenen Struktur mit Nullen gefüllt ist, wird der Socket getrennt. Dann ist die Standard-Remoteadresse unbestimmt, sodassWSASend-/ und recv/ WSARecv-Aufrufe den Fehlercode WSAENOTCONN zurückgeben. Sendto / WSASendTo und recvfrom/ WSARecvFrom können jedoch weiterhin verwendet werden. Das Standardziel kann geändert werden, indem Sie einfach erneut connect aufrufen, auch wenn der Socket bereits verbunden ist. Alle Datagramme, die für den Empfang in die Warteschlange eingereiht wurden, werden verworfen, wenn sich der Name von der vorherigen Verbindung unterscheidet.

Bei verbindungslosen Sockets kann der Name eine beliebige gültige Adresse angeben, einschließlich einer Broadcastadresse. Um jedoch eine Verbindung mit einer Broadcastadresse herzustellen, muss ein Socket setockopt verwenden, um die Option SO_BROADCAST zu aktivieren. Andernfalls schlägt die Verbindung mit dem Fehlercode WSAEACCES fehl.

Wenn eine Verbindung zwischen Sockets unterbrochen wird, sollte der verbundene Socket verworfen und ein neuer Socket erstellt werden. Wenn ein Problem bei einem verbundenen Socket auftritt, muss die Anwendung den Socket verwerfen und den Socket erneut erstellen, um zu einem stabilen Punkt zurückzukehren.

Hinweis Wenn Sie einen blockierenden Winsock-Aufruf wie "Connect" ausgeben, muss Winsock möglicherweise auf ein Netzwerkereignis warten, bevor der Anruf abgeschlossen werden kann. Winsock führt in dieser Situation eine warnbare Wartezeit aus, die durch einen asynchronen Prozeduraufruf (APC) unterbrochen werden kann, der für denselben Thread geplant ist. Das Ausstellen eines weiteren blockierenden Winsock-Aufrufs innerhalb eines APC, der einen fortlaufend blockierenden Winsock-Aufruf im selben Thread unterbrochen hat, führt zu undefiniertem Verhalten und darf niemals von Winsock-Clients versucht werden.
 

Beispielcode

Im folgenden Beispiel wird die Verwendung der Connect-Funktion veranschaulicht.
#ifndef UNICODE
#define UNICODE
#endif

#define WIN32_LEAN_AND_MEAN

#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>

// Need to link with Ws2_32.lib
#pragma comment(lib, "ws2_32.lib")

int wmain()
{
    //----------------------
    // Initialize Winsock
    WSADATA wsaData;
    int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != NO_ERROR) {
        wprintf(L"WSAStartup function failed with error: %d\n", iResult);
        return 1;
    }
    //----------------------
    // Create a SOCKET for connecting to server
    SOCKET ConnectSocket;
    ConnectSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (ConnectSocket == INVALID_SOCKET) {
        wprintf(L"socket function failed with error: %ld\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }
    //----------------------
    // The sockaddr_in structure specifies the address family,
    // IP address, and port of the server to be connected to.
    sockaddr_in clientService;
    clientService.sin_family = AF_INET;
    clientService.sin_addr.s_addr = inet_addr("127.0.0.1");
    clientService.sin_port = htons(27015);

    //----------------------
    // Connect to server.
    iResult = connect(ConnectSocket, (SOCKADDR *) & clientService, sizeof (clientService));
    if (iResult == SOCKET_ERROR) {
        wprintf(L"connect function failed with error: %ld\n", WSAGetLastError());
        iResult = closesocket(ConnectSocket);
        if (iResult == SOCKET_ERROR)
            wprintf(L"closesocket function failed with error: %ld\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }

    wprintf(L"Connected to server.\n");

    iResult = closesocket(ConnectSocket);
    if (iResult == SOCKET_ERROR) {
        wprintf(L"closesocket function failed with error: %ld\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }

    WSACleanup();
    return 0;
}


Ein weiteres Beispiel, das die Connect-Funktion verwendet, finden Sie unter Erste Schritte Mit Winsock.

Hinweise zu IrDA-Sockets

  • Die Headerdatei Af_irda.h muss explizit eingeschlossen werden.
  • Wenn eine vorhandene IrDA-Verbindung auf der Medienzugriffsebene erkannt wird, wird WSAENETDOWN zurückgegeben.
  • Wenn aktive Verbindungen mit einem Gerät mit einer anderen Adresse vorhanden sind, wird WSAEADDRINUSE zurückgegeben.
  • Wenn der Socket bereits verbunden ist oder eine Änderung des exklusiven/multiplexierten Modus fehlgeschlagen ist, wird WSAEISCONN zurückgegeben.
  • Wenn der Socket zuvor an einen lokalen Dienstnamen gebunden war, um eingehende Verbindungen mithilfe der Bindung zu akzeptieren, wird WSAEINVAL zurückgegeben. Beachten Sie, dass ein Socket, sobald er gebunden ist, nicht zum Herstellen einer ausgehenden Verbindung verwendet werden kann.

IrDA implementiert die Connect-Funktion mit Adressen der Form sockaddr_irda. In der Regel erstellt eine Clientanwendung einen Socket mit der Socketfunktion, scannt die unmittelbare Umgebung nach IrDA-Geräten mit der Option IRLMP_ENUMDEVICES Socket, wählt ein Gerät aus der zurückgegebenen Liste aus, bildet eine Adresse und ruft dann die Verbindung auf. Es gibt keinen Unterschied zwischen blockierender und nicht blockierender Semantik.

Anforderungen

   
Unterstützte Mindestversion (Client) Windows Vista [Desktop-Apps | UWP-Apps]
Unterstützte Mindestversion (Server) Windows Server 2003 [Desktop-Apps | UWP-Apps]
Zielplattform Windows
Kopfzeile winsock2.h
Bibliothek Ws2_32.lib
DLL Ws2_32.dll

Weitere Informationen

WSAAsyncSelect

WSAConnect

ConnectEx

Winsock-Funktionen

Winsock-Referenz

Akzeptieren

bind

getsockname

select

sockaddr

Socket