accept-Funktion (winsock2.h)

Die Accept-Funktion lässt einen eingehenden Verbindungsversuch an einem Socket zu.

Syntax

SOCKET WSAAPI accept(
  [in]      SOCKET   s,
  [out]     sockaddr *addr,
  [in, out] int      *addrlen
);

Parameter

[in] s

Ein Deskriptor, der einen Socket identifiziert, der mit der Listenfunktion in einen Lauschzustand versetzt wurde. Die Verbindung wird tatsächlich mit dem Socket hergestellt, der von accept zurückgegeben wird.

[out] addr

Ein optionaler Zeiger auf einen Puffer, der die Adresse der verbindenden Entität empfängt, wie für die Kommunikationsschicht bekannt. Das genaue Format des Addr-Parameters wird durch die Adressfamilie bestimmt, die beim Erstellen des Sockets aus der sockaddr-Struktur eingerichtet wurde.

[in, out] addrlen

Ein optionaler Zeiger auf eine ganze Zahl, die die Länge der Struktur enthält, auf die der addr-Parameter verweist.

Rückgabewert

Wenn kein Fehler auftritt, gibt Accept einen Wert vom Typ SOCKET zurück, der ein Deskriptor für den neuen Socket ist. Dieser zurückgegebene Wert ist ein Handle für den Socket, mit dem die tatsächliche Verbindung hergestellt wird.

Andernfalls wird der Wert INVALID_SOCKET zurückgegeben, und ein bestimmter Fehlercode kann durch Aufrufen von WSAGetLastError abgerufen werden.

Die ganze Zahl, auf die von addrlen verwiesen wird, enthält zunächst die Menge des Leerzeichens, auf das vom Addr verwiesen wird. Bei der Rückgabe enthält es die tatsächliche Länge der zurückgegebenen Adresse in Bytes.

Fehlercode Bedeutung
WSANOTINITIALISIERT
Vor der Verwendung dieser Funktion muss ein erfolgreicher WSAStartup-Aufruf erfolgen.
WSAECONNRESET
Es wurde eine eingehende Verbindung angegeben, die jedoch vor der Annahme des Anrufs vom Remotepeer beendet wurde.
WSAEFAULT
Der addrlen-Parameter ist zu klein, oder addr ist kein gültiger Teil des Benutzeradressraums.
WSAEINTR
Ein blockierender Windows Sockets 1.1-Aufruf wurde über WSACancelBlockingCall abgebrochen.
WSAEINVAL
Die Listenfunktion wurde vor der Annahme nicht aufgerufen.
WSAEINPROGRESS
Ein blockierter Windows Sockets 1.1-Aufruf wird ausgeführt, oder der Dienstanbieter verarbeitet weiterhin eine Rückruffunktion.
WSAEMFILE
Die Warteschlange ist beim Eintritt nicht erloschen, und es sind keine Deskriptoren verfügbar.
WSAENETDOWN
Beim Netzwerksubsystem ist ein Fehler aufgetreten.
WSAENOBUFS
Es ist kein Pufferplatz verfügbar.
WSAENOTSOCK
Der Deskriptor ist kein Socket.
WSAEOPNOTSUPP
Der Socket, auf den verwiesen wird, ist kein Typ, der verbindungsorientierte Dienste unterstützt.
WSAEWOULDBLOCK
Der Socket ist als nicht blockierend gekennzeichnet, und es sind keine Verbindungen vorhanden, die akzeptiert werden können.

Hinweise

Die Accept-Funktion extrahiert die erste Verbindung in der Warteschlange der ausstehenden Verbindungen für Sockets. Anschließend wird ein Handle erstellt und an den neuen Socket zurückgegeben. Der neu erstellte Socket ist der Socket, der die tatsächliche Verbindung verarbeitet. Es verfügt über dieselben Eigenschaften wie Sockets, einschließlich der asynchronen Ereignisse, die mit den Funktionen WSAAsyncSelect oder WSAEventSelect registriert wurden.

Die Accept-Funktion kann den Aufrufer blockieren, bis eine Verbindung vorhanden ist, wenn keine ausstehenden Verbindungen in der Warteschlange vorhanden sind und der Socket als blockierend markiert ist. Wenn der Socket als nicht blockierend gekennzeichnet ist und keine ausstehenden Verbindungen in der Warteschlange vorhanden sind, gibt accept einen Fehler zurück, wie im Folgenden beschrieben. Nach dem erfolgreichen Abschluss von accept wird ein neues Sockethandle zurückgegeben, kann der akzeptierte Socket nicht verwendet werden, um weitere Verbindungen zu akzeptieren. Der ursprüngliche Socket bleibt geöffnet und lauscht auf neue Verbindungsanforderungen.

Der Parameter-Addr ist ein Ergebnisparameter, der mit der Adresse der verbindenden Entität ausgefüllt wird, wie für die Kommunikationsschicht bekannt. Das genaue Format des Addr-Parameters wird durch die Adressfamilie bestimmt, in der die Kommunikation stattfindet. Das addrlen ist ein Wert-Ergebnis-Parameter. Es sollte zunächst die Vom Addr angegebene Menge an Leerzeichen enthalten; Bei der Rückgabe enthält es die tatsächliche Länge (in Bytes) der zurückgegebenen Adresse.

Die Accept-Funktion wird mit verbindungsorientierten Sockettypen wie SOCK_STREAM verwendet. Wenn addr und/oder addrlengleich NULL sind, werden keine Informationen zur Remoteadresse des akzeptierten Sockets zurückgegeben.

Hinweis Wenn Sie einen blockierenden Winsock-Aufruf wie annehmen ausstellen, muss Winsock möglicherweise auf ein Netzwerkereignis warten, bevor der Aufruf 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 Ausgeben eines weiteren blockierenden Winsock-Aufrufs in einem APC, der einen fortlaufenden blockierenden Winsock-Aufruf im selben Thread unterbrochen hat, führt zu nicht definiertem Verhalten und darf niemals von Winsock-Clients versucht werden.
 

Beispielcode

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

#include <winsock2.h>
#include <WS2tcpip.h>
#include <stdio.h>
#include <windows.h>

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

int wmain(void)
{

    //----------------------
    // Initialize Winsock.
    WSADATA wsaData;
    int iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != NO_ERROR) {
        wprintf(L"WSAStartup failed with error: %ld\n", iResult);
        return 1;
    }
    //----------------------
    // Create a SOCKET for listening for
    // incoming connection requests.
    SOCKET ListenSocket;
    ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (ListenSocket == INVALID_SOCKET) {
        wprintf(L"socket failed with error: %ld\n", WSAGetLastError());
        WSACleanup();
        return 1;
    }
    //----------------------
    // The sockaddr_in structure specifies the address family,
    // IP address, and port for the socket that is being bound.
    sockaddr_in service;
    service.sin_family = AF_INET;
    service.sin_port = htons(27015);
    inet_pton(AF_INET, "127.0.0.1", &service.sin_addr);

    if (bind(ListenSocket,
             (SOCKADDR *) & service, sizeof (service)) == SOCKET_ERROR) {
        wprintf(L"bind failed with error: %ld\n", WSAGetLastError());
        closesocket(ListenSocket);
        WSACleanup();
        return 1;
    }
    //----------------------
    // Listen for incoming connection requests.
    // on the created socket
    if (listen(ListenSocket, 1) == SOCKET_ERROR) {
        wprintf(L"listen failed with error: %ld\n", WSAGetLastError());
        closesocket(ListenSocket);
        WSACleanup();
        return 1;
    }
    //----------------------
    // Create a SOCKET for accepting incoming requests.
    SOCKET AcceptSocket;
    wprintf(L"Waiting for client to connect...\n");

    //----------------------
    // Accept the connection.
    AcceptSocket = accept(ListenSocket, NULL, NULL);
    if (AcceptSocket == INVALID_SOCKET) {
        wprintf(L"accept failed with error: %ld\n", WSAGetLastError());
        closesocket(ListenSocket);
        WSACleanup();
        return 1;
    } else
        wprintf(L"Client connected.\n");

    // No longer need server socket
    closesocket(ListenSocket);

    WSACleanup();
    return 0;
}


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

Hinweise für ATM

Die folgenden wichtigen Probleme im Zusammenhang mit der Verbindungseinrichtung müssen bei der Verwendung des asynchronen Übertragungsmodus (ATM) mit Windows Sockets 2 berücksichtigt werden:

  • Die Funktionen accept und WSAAccept legen nicht unbedingt die Parameter für die Remoteadresse und die Adresslänge fest. Daher sollte der Aufrufer bei Verwendung von ATM die WSAAccept-Funktion verwenden und ATM_CALLING_PARTY_NUMBER_IE im ProviderSpecific-Member der QoS-Struktur platzieren, das selbst im lpSQOS-Parameter der Rückruffunktion enthalten ist, die gemäß WSAAccept verwendet wird.
  • Beachten Sie bei Verwendung der Accept-Funktion , dass die Funktion möglicherweise zurückgegeben wird, bevor die Verbindungsherstellung die gesamte Entfernung zwischen Sender und Empfänger durchlaufen hat. Dies liegt daran, dass die accept-Funktion zurückgegeben wird, sobald sie eine CONNECT ACK-Nachricht empfängt. in ATM wird eine CONNECT ACK-Nachricht vom nächsten Switch im Pfad zurückgegeben, sobald eine CONNECT-Nachricht verarbeitet wird (und nicht die CONNECT-ACK vom Endknoten gesendet wird, mit dem die Verbindung letztendlich hergestellt wird). Daher sollten Anwendungen erkennen, dass beim Senden von Daten unmittelbar nach Dem Empfang einer CONNECT ACK-Nachricht ein Datenverlust möglich ist, da die Verbindung zwischen Absender und Empfänger möglicherweise nicht vollständig hergestellt wurde.

Windows 8.1 und Windows Server 2012 R2: Diese Funktion wird für Windows Store-Apps auf Windows 8.1, Windows Server 2012 R2 und höher unterstützt.

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Windows 8.1, 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

WSAAccept

WSAAsyncWählen

Winsock-Funktionen

Winsock-Referenz

bind

connect

listen

select

sockaddr

Socket