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 |
---|---|
Vor der Verwendung dieser Funktion muss ein erfolgreicher WSAStartup-Aufruf erfolgen. | |
Es wurde eine eingehende Verbindung angegeben, die jedoch vor der Annahme des Anrufs vom Remotepeer beendet wurde. | |
Der addrlen-Parameter ist zu klein, oder addr ist kein gültiger Teil des Benutzeradressraums. | |
Ein blockierender Windows Sockets 1.1-Aufruf wurde über WSACancelBlockingCall abgebrochen. | |
Die Listenfunktion wurde vor der Annahme nicht aufgerufen. | |
Ein blockierter Windows Sockets 1.1-Aufruf wird ausgeführt, oder der Dienstanbieter verarbeitet weiterhin eine Rückruffunktion. | |
Die Warteschlange ist beim Eintritt nicht erloschen, und es sind keine Deskriptoren verfügbar. | |
Beim Netzwerksubsystem ist ein Fehler aufgetreten. | |
Es ist kein Pufferplatz verfügbar. | |
Der Deskriptor ist kein Socket. | |
Der Socket, auf den verwiesen wird, ist kein Typ, der verbindungsorientierte Dienste unterstützt. | |
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.
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 |