Condividi tramite


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
WSANOTINITIALISED
Prima di usare questa funzione, è necessario eseguire una chiamata WSAStartup riuscita.
WSAECONNRESET
È stata indicata una connessione in ingresso, ma successivamente è stata terminata dal peer remoto prima di accettare la chiamata.
WSAEFAULT
Il parametro addrlen è troppo piccolo o addr non è una parte valida dello spazio degli indirizzi utente.
WSAEINTR
Una chiamata di Windows Sockets 1.1 bloccata è stata annullata tramite WSACancelBlockingCall.
WSAEINVAL
La funzione di ascolto non è stata richiamata prima di accettare.
WSAEINPROGRESS
Una chiamata windows Sockets 1.1 bloccata è in corso oppure il provider di servizi sta ancora elaborando una funzione di callback.
WSAEMFILE
La coda non viene interrotta al momento dell'accettazione e non sono disponibili descrittori.
WSAENETDOWN
Il sottosistema di rete non è riuscito.
WSAENOBUFS
Nessuno spazio di buffer disponibile.
WSAENOTSOCK
Il descrittore non è un socket.
WSAEOPNOTSUPP
Il socket a cui si fa riferimento non è un tipo che supporta il servizio orientato alla connessione.
WSAEWOULDBLOCK
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.

Nota Quando si emette una chiamata Winsock bloccata, ad esempio accetta, Winsock potrebbe dover attendere il completamento di un evento di rete prima del completamento della chiamata. Winsock esegue un'attesa avvisabile in questa situazione, che può essere interrotta da una chiamata di routine asincrona pianificata nello stesso thread. L'emissione di un'altra chiamata winsock bloccata all'interno di un APC che ha interrotto una chiamata winsock in corso sullo stesso thread comporterà un comportamento non definito e non deve mai essere tentato dai client Winsock.
 

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

Vedi anche

WSAAccept

WSAAsyncSelect

Funzioni Winsock

Informazioni di riferimento su Winsock

bind

connect

listen

select

sockaddr

socket