funzione accept (winsock2.h)
La funzione accept consente un tentativo di connessione in ingresso su un socket.
Sintassi
SOCKET WSAAPI accept(
[in] SOCKET s,
[out] sockaddr *addr,
[in, out] int *addrlen
);
Parametri
[in] s
Descrittore che identifica un socket inserito in uno stato di ascolto con la funzione di ascolto . La connessione viene effettivamente effettuata con il socket restituito dall'accettazione.
[out] addr
Puntatore facoltativo a un buffer che riceve l'indirizzo dell'entità di connessione, come noto al livello di comunicazione. Il formato esatto del parametro addr è determinato dalla famiglia di indirizzi stabilita quando è stato creato il socket dalla struttura sockaddr .
[in, out] addrlen
Puntatore facoltativo a un intero contenente la lunghezza della struttura puntata dal parametro addr .
Valore restituito
Se non si verifica alcun errore, accetta restituisce un valore di tipo SOCKET che è un descrittore per il nuovo socket. Questo valore restituito è un handle per il socket in cui viene effettuata la connessione effettiva.
In caso contrario, viene restituito un valore di INVALID_SOCKET e un codice di errore specifico può essere recuperato chiamando WSAGetLastError.
L'intero a cui fa riferimento addrlen inizialmente contiene la quantità di spazio puntata da addr. Al ritorno conterrà la lunghezza effettiva in byte dell'indirizzo restituito.
Codice di errore | Significato |
---|---|
Prima di usare questa funzione, è necessario eseguire una chiamata WSAStartup riuscita. | |
È stata indicata una connessione in ingresso, ma successivamente è stata terminata dal peer remoto prima di accettare la chiamata. | |
Il parametro addrlen è troppo piccolo o addr non è una parte valida dello spazio degli indirizzi utente. | |
Una chiamata di Windows Sockets 1.1 bloccata è stata annullata tramite WSACancelBlockingCall. | |
La funzione di ascolto non è stata richiamata prima di accettare. | |
Una chiamata windows Sockets 1.1 bloccata è in corso oppure il provider di servizi sta ancora elaborando una funzione di callback. | |
La coda non viene interrotta al momento dell'accettazione e non sono disponibili descrittori. | |
Il sottosistema di rete non è riuscito. | |
Nessuno spazio di buffer disponibile. | |
Il descrittore non è un socket. | |
Il socket a cui si fa riferimento non è un tipo che supporta il servizio orientato alla connessione. | |
Il socket è contrassegnato come non bloccante e non sono presenti connessioni da accettare. |
Commenti
La funzione accept estrae la prima connessione nella coda di connessioni in sospeso sul socket s. Crea quindi e restituisce un handle al nuovo socket. Il socket appena creato è il socket che gestirà la connessione effettiva; ha le stesse proprietà di socket s, inclusi gli eventi asincroni registrati con le funzioni WSAAsyncSelect o WSAEventSelect.
La funzione di accettazione può bloccare il chiamante fino a quando non è presente una connessione se non sono presenti connessioni in sospeso nella coda e il socket è contrassegnato come blocco. Se il socket è contrassegnato come non bloccante e non sono presenti connessioni in sospeso nella coda, accettare restituisce un errore come descritto di seguito. Al termine dell'accettazione , il socket accettato non può essere usato per accettare più connessioni. Il socket originale rimane aperto e ascolta le nuove richieste di connessione.
Il componente aggiuntivo del parametro è un parametro di risultato compilato con l'indirizzo dell'entità di connessione, come noto al livello di comunicazione. Il formato esatto del parametro addr è determinato dalla famiglia di indirizzi in cui si sta verificando la comunicazione. L'addrlen è un parametro value-result; deve inizialmente contenere la quantità di spazio puntata da addr; in caso di restituzione, conterrà la lunghezza effettiva (in byte) dell'indirizzo restituito.
La funzione accept viene usata con tipi di socket orientati alla connessione, ad esempio SOCK_STREAM. Se addr e/o addrlen sono uguali a NULL, non vengono restituite informazioni sull'indirizzo remoto del socket accettato.
Codice di esempio
Nell'esempio seguente viene illustrato l'uso della funzione accept .#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;
}
Per un altro esempio che usa la funzione di accettazione, vedere Introduzione With Winsock.
Note per ATM
Di seguito sono riportati problemi importanti associati all'installazione della connessione e devono essere considerati quando si usa la modalità di trasferimento asincrona (ATM) con Windows Sockets 2:
- Le funzioni accept e WSAAccept non impostano necessariamente i parametri di lunghezza degli indirizzi e degli indirizzi remoti. Pertanto, quando si usa ATM, il chiamante deve usare la funzione WSAAccept e posizionare ATM_CALLING_PARTY_NUMBER_IE nel membro ProviderSpecific della struttura QoS , inclusa nel parametro lpSQOS della funzione di callback usata in conformità con WSAAccept.
- Quando si usa la funzione di accettazione , verificare che la funzione possa restituire prima che l'istituzione della connessione abbia attraversato l'intera distanza tra il mittente e il ricevitore. Si tratta del fatto che la funzione di accettazione restituisce non appena riceve un messaggio CONNECT ACK; in ATM, un messaggio CONNECT ACK viene restituito dal commutatore successivo nel percorso non appena viene elaborato un messaggio CONNECT (anziché connect ACK inviato dal nodo finale a cui viene stabilita la connessione). Di conseguenza, le applicazioni devono comprendere che se i dati vengono inviati immediatamente dopo la ricezione di un messaggio CONNECT ACK, la perdita di dati è possibile, poiché la connessione potrebbe non essere stata stabilita in tutto il modo tra mittente e ricevitore.
Windows 8.1 e Windows Server 2012 R2: questa funzione è supportata per le app di Windows Store in Windows 8.1, Windows Server 2012 R2 e versioni successive.
Requisiti
Requisito | Valore |
---|---|
Client minimo supportato | Windows 8.1, Windows Vista [app desktop | App UWP] |
Server minimo supportato | Windows Server 2003 [app desktop | App UWP] |
Piattaforma di destinazione | Windows |
Intestazione | winsock2.h |
Libreria | Ws2_32.lib |
DLL | Ws2_32.dll |