Condividi tramite


Funzione WSASocketW (winsock2.h)

La funzione WSASocket crea un socket associato a un provider di servizi di trasporto specifico.

Sintassi

SOCKET WSAAPI WSASocketW(
  [in] int                 af,
  [in] int                 type,
  [in] int                 protocol,
  [in] LPWSAPROTOCOL_INFOW lpProtocolInfo,
  [in] GROUP               g,
  [in] DWORD               dwFlags
);

Parametri

[in] af

Specifica della famiglia di indirizzi. I valori possibili per la famiglia di indirizzi sono definiti nel file di intestazione Winsock2.h .

Nella Windows SDK rilasciata per Windows Vista e versioni successive, l'organizzazione dei file di intestazione è stata modificata e i valori possibili per la famiglia di indirizzi vengono definiti nel file di intestazione Ws2def.h. Si noti che il file di intestazione Ws2def.h viene incluso automaticamente in Winsock2.h e non deve mai essere usato direttamente.

I valori attualmente supportati sono AF_INET o AF_INET6, ovvero i formati della famiglia di indirizzi Internet per IPv4 e IPv6. Altre opzioni per la famiglia di indirizzi (AF_NETBIOS per l'uso con NetBIOS, ad esempio) sono supportate se è installato un provider di servizi Windows Sockets per la famiglia di indirizzi. Si noti che i valori per la famiglia di indirizzi AF_ e le costanti della famiglia di protocolli di PF_ sono identiche (ad esempio, AF_INET e PF_INET), in modo che sia possibile usare una costante.

La tabella seguente elenca i valori comuni per la famiglia di indirizzi, anche se sono possibili molti altri valori.

Af Significato
AF_UNSPEC
0
La famiglia di indirizzi non è specificata.
AF_INET
2
Famiglia di indirizzi Internet Protocol versione 4 (IPv4).
AF_IPX
6
Famiglia di indirizzi IPX/SPX. Questa famiglia di indirizzi è supportata solo se è installato il protocollo di trasporto compatibile con NWLink IPX/SPX NetBIOS.

Questa famiglia di indirizzi non è supportata in Windows Vista e versioni successive.

AF_APPLETALK
16
Famiglia di indirizzi AppleTalk. Questa famiglia di indirizzi è supportata solo se è installato il protocollo AppleTalk.

Questa famiglia di indirizzi non è supportata in Windows Vista e versioni successive.

AF_NETBIOS
17
Famiglia di indirizzi NetBIOS. Questa famiglia di indirizzi è supportata solo se il provider Windows Sockets per NetBIOS è installato.

Il provider Windows Sockets per NetBIOS è supportato in versioni a 32 bit di Windows. Questo provider viene installato per impostazione predefinita nelle versioni a 32 bit di Windows.

Il provider Windows Sockets per NetBIOS non è supportato in versioni a 64 bit di windows, tra cui Windows 7, Windows Server 2008, Windows Vista, Windows Server 2003 o Windows XP.

Il provider Windows Sockets per NetBIOS supporta solo i socket in cui il parametro di tipo è impostato su SOCK_DGRAM.

Il provider Windows Sockets per NetBIOS non è direttamente correlato all'interfaccia di programmazione NetBIOS . L'interfaccia di programmazione NetBIOS non è supportata in Windows Vista, Windows Server 2008 e versioni successive.

AF_INET6
23
Famiglia di indirizzi IPv6 (Internet Protocol 6).
AF_IRDA
26
Famiglia di indirizzi IrDA (Infrared Data Association).

Questa famiglia di indirizzi è supportata solo se il computer ha una porta e un driver a infrarossi installati.

AF_BTH
32
Famiglia di indirizzi Bluetooth.

Questa famiglia di indirizzi è supportata in Windows XP con SP2 o versioni successive se il computer ha una scheda Bluetooth e un driver installato.

[in] type

Specifica del tipo per il nuovo socket.

I valori possibili per il tipo di socket sono definiti nel file di intestazione Winsock2.h .

Nella tabella seguente sono elencati i valori possibili per il parametro di tipo supportato per Windows Sockets 2:

Type Significato
SOCK_STREAM
1
Tipo di socket che fornisce flussi di byte basati su byte sequenziati, affidabili e bidirezionali con un meccanismo di trasmissione dati OOB. Questo tipo di socket usa il protocollo TCP (Transmission Control Protocol) per la famiglia di indirizzi Internet (AF_INET o AF_INET6).
SOCK_DGRAM
2
Tipo di socket che supporta i datagrammi, senza connessione, buffer non affidabili di una lunghezza massima fissa (in genere piccola). Questo tipo di socket usa il protocollo UDP (User Datagram Protocol) per la famiglia di indirizzi Internet (AF_INET o AF_INET6).
SOCK_RAW
3
Tipo di socket che fornisce un socket non elaborato che consente a un'applicazione di modificare l'intestazione del protocollo di livello superiore successivo. Per modificare l'intestazione IPv4, l'opzione socket IP_HDRINCL deve essere impostata sul socket. Per modificare l'intestazione IPv6, è necessario impostare l'opzione socket IPV6_HDRINCL sul socket.
SOCK_RDM
4
Tipo di socket che fornisce un datagramma di messaggi affidabile. Un esempio di questo tipo è l'implementazione del protocollo multicast (PGM) pragmatico in Windows, spesso definita programmazione multicast affidabile.

Questo valore di tipo è supportato solo se il protocollo Reliable Multicast è installato.

SOCK_SEQPACKET
5
Tipo di socket che fornisce un pacchetto di pseudo-flusso basato su datagrammi.
 

In Windows Sockets 2 sono stati introdotti nuovi tipi di socket. Un'applicazione può individuare dinamicamente gli attributi di ogni protocollo di trasporto disponibile tramite la funzione WSAEnumProtocols . Un'applicazione può quindi determinare le possibili opzioni di socket e protocollo per una famiglia di indirizzi e usare queste informazioni quando si specifica questo parametro. Le definizioni dei tipi di socket nei file di intestazione Winsock2.h e Ws2def.h verranno aggiornate periodicamente come nuovi tipi di socket, famiglie di indirizzi e protocolli sono definiti.

In Windows Sockets 1.1, gli unici tipi di socket possibili sono SOCK_DGRAM e SOCK_STREAM.

[in] protocol

Protocollo da usare. Le opzioni possibili per il parametro del protocollo sono specifiche della famiglia di indirizzi e del tipo socket specificato. I valori possibili per il protocollo sono definiti nei file di intestazione Winsock2.h e Wsrm.h .

Nella Windows SDK rilasciata per Windows Vista e versioni successive, l'organizzazione dei file di intestazione è stata modificata e questo parametro può essere uno dei valori del tipo di enumerazione IPPROTO definito nel file di intestazione Ws2def.h. Si noti che il file di intestazione Ws2def.h viene incluso automaticamente in Winsock2.h e non deve mai essere usato direttamente.

Se viene specificato un valore pari a 0, il chiamante non vuole specificare un protocollo e il provider di servizi sceglierà il protocollo da usare.

Quando il parametro af è AF_INET o AF_INET6 e il tipo è SOCK_RAW, il valore specificato per il protocollo è impostato nel campo protocollo dell'intestazione del pacchetto IPv6 o IPv4.

La tabella seguente elenca i valori comuni per il protocollo anche se sono possibili molti altri valori.

protocol Significato
IPPROTO_ICMP
1
Protocollo ICMP (Internet Control Message Protocol). Si tratta di un valore possibile quando il parametro af è AF_UNSPEC, AF_INEToAF_INET6 e il parametro di tipo è SOCK_RAW o non specificato.

Questo valore di protocollo è supportato in Windows XP e versioni successive.

IPPROTO_IGMP
2
IGMP (Internet Group Management Protocol). Si tratta di un valore possibile quando il parametro af è AF_UNSPEC, AF_INET o AF_INET6 e il parametro di tipo è SOCK_RAW o non specificato.

Questo valore di protocollo è supportato in Windows XP e versioni successive.

BTHPROTO_RFCOMM
3
Protocollo Bluetooth Radio Frequency Communications (Bluetooth RFCOMM). Si tratta di un valore possibile quando il parametro af è AF_BTH e il parametro di tipo è SOCK_STREAM.

Questo valore di protocollo è supportato in Windows XP con SP2 o versione successiva.

IPPROTO_TCP
6
TCP (Transmission Control Protocol). Si tratta di un valore possibile quando il parametro af è AF_INET o AF_INET6 e il parametro di tipo è SOCK_STREAM.
IPPROTO_UDP
17
Protocollo UDP (User Datagram Protocol). Si tratta di un valore possibile quando il parametro af è AF_INET o AF_INET6 e il parametro di tipo è SOCK_DGRAM.
IPPROTO_ICMPV6
58
Internet Control Message Protocol versione 6 (ICMPv6). Si tratta di un valore possibile quando il parametro af è AF_UNSPEC, AF_INET o AF_INET6 e il parametro di tipo è SOCK_RAW o non specificato.

Questo valore di protocollo è supportato in Windows XP e versioni successive.

IPPROTO_RM
113
Protocollo PGM per multicast affidabile. Si tratta di un valore possibile quando il parametro af è AF_INET e il parametro di tipo è SOCK_RDM. Nel Windows SDK rilasciato per Windows Vista e versioni successive, questo protocollo viene chiamato anche IPPROTO_PGM.

Questo valore di protocollo è supportato solo se il protocollo Reliable Multicast è installato.

[in] lpProtocolInfo

Puntatore a una struttura WSAPROTOCOL_INFO che definisce le caratteristiche del socket da creare. Se questo parametro non è NULL, il socket verrà associato al provider associato alla struttura WSAPROTOCOL_INFO indicata.

[in] g

UN ID gruppo di socket esistente o un'azione appropriata da eseguire durante la creazione di un nuovo socket e di un nuovo gruppo di socket.

Se g è un ID gruppo di socket esistente, aggiungere il nuovo socket a questo gruppo di socket, purché vengano soddisfatti tutti i requisiti impostati da questo gruppo.

Se g non è un ID gruppo di socket esistente, sono possibili i valori seguenti.

g Significato
0
Non viene eseguita alcuna operazione di gruppo.
SG_UNCONSTRAINED_GROUP
0x01
Creare un gruppo di socket non vincolato e fare in modo che il nuovo socket sia il primo membro. Per un gruppo senza vincoli, Winsock non vincola tutti i socket nel gruppo di socket per essere stati creati con lo stesso valore per i parametri di tipo e protocollo .
SG_CONSTRAINED_GROUP
0x02
Creare un gruppo di socket vincolato e fare in modo che il nuovo socket sia il primo membro. Per un gruppo di socket vincolato, Winsock vincola tutti i socket nel gruppo di socket per essere stati creati con lo stesso valore per i parametri di tipo e protocollo . Un gruppo di socket vincolato può essere costituito solo da socket orientati alla connessione e richiede che le connessioni su tutti i socket raggruppati corrispondano allo stesso indirizzo nello stesso host.
 
Nota Le costanti SG_UNCONSTRAINED_GROUP e SG_CONSTRAINED_GROUP non sono attualmente definite in un file di intestazione pubblica.
 

[in] dwFlags

Set di flag utilizzati per specificare attributi socket aggiuntivi.

È possibile impostare una combinazione di questi flag, anche se alcune combinazioni non sono consentite.

Valore Significato
WSA_FLAG_OVERLAPPED
0x01
Creare un socket che supporti operazioni di I/O sovrapposte.

La maggior parte dei socket deve essere creata con questo set di flag. I socket sovrapposti possono utilizzare WSASend, WSASendTo, WSARecv, WSARecvFrom e WSAIoctl per operazioni di I/O sovrapposte, che consentono l'avvio e l'avanzamento simultaneo di più operazioni.

Tutte le funzioni che consentono operazioni sovrapposte (WSASend, WSARecv, WSASendTo, WSARecvFrom, WSAIoctl) supportano anche l'utilizzo non sovrapposto in un socket sovrapposto se i valori per i parametri correlati alle operazioni sovrapposte sono NULL.

WSA_FLAG_MULTIPOINT_C_ROOT
0x02
Creare un socket che sarà un c_root in una sessione multipunto.

Questo attributo è consentito solo se la struttura WSAPROTOCOL_INFO per il provider di trasporto che crea il socket supporta un meccanismo multipoint o multicast e il piano di controllo per una sessione multipoint è rooted. Ciò sarebbe indicato dal membro dwServiceFlags1 della struttura WSAPROTOCOL_INFO con i flag XP1_SUPPORT_MULTIPOINT e XP1_MULTIPOINT_CONTROL_PLANE impostati.

Quando il parametro lpProtocolInfo non è NULL, la struttura WSAPROTOCOL_INFO per il provider di trasporto fa riferimento al parametro lpProtocolInfo . Quando il parametro lpProtocolInfo è NULL, la struttura WSAPROTOCOL_INFO si basa sul provider di trasporto selezionato dai valori specificati per i parametri af, type e protocol .

Per altre informazioni su una sessione multipoint, vedere Multipoint e Semantica multicast .

WSA_FLAG_MULTIPOINT_C_LEAF
0x04
Creare un socket che sarà un c_leaf in una sessione multipunto.

Questo attributo è consentito solo se la struttura di WSAPROTOCOL_INFO per il provider di trasporto che crea il socket supporta un meccanismo multipoint o multicast e il piano di controllo per una sessione multipoint non è rooted. Ciò sarebbe indicato dal membro dwServiceFlags1 della struttura WSAPROTOCOL_INFO con il flag XP1_SUPPORT_MULTIPOINT impostato e il flag XP1_MULTIPOINT_CONTROL_PLANE non impostato.

Quando il parametro lpProtocolInfo non è NULL, la struttura WSAPROTOCOL_INFO per il provider di trasporto fa riferimento al parametro lpProtocolInfo . Quando il parametro lpProtocolInfo è NULL, la struttura WSAPROTOCOL_INFO si basa sul provider di trasporto selezionato dai valori specificati per i parametri af, type e protocol .

Per altre informazioni su una sessione multipoint, vedere Multipoint e Semantica multicast .

WSA_FLAG_MULTIPOINT_D_ROOT
0x08
Creare un socket che sarà un d_root in una sessione multipunto.

Questo attributo è consentito solo se la struttura WSAPROTOCOL_INFO per il provider di trasporto che crea il socket supporta un meccanismo multipoint o multicast e il piano dati per una sessione multipoint è rooted. Ciò sarebbe indicato dal membro dwServiceFlags1 della struttura WSAPROTOCOL_INFO con i flag XP1_SUPPORT_MULTIPOINT e XP1_MULTIPOINT_DATA_PLANE impostati.

Quando il parametro lpProtocolInfo non è NULL, la struttura WSAPROTOCOL_INFO per il provider di trasporto fa riferimento al parametro lpProtocolInfo . Quando il parametro lpProtocolInfo è NULL, la struttura WSAPROTOCOL_INFO si basa sul provider di trasporto selezionato dai valori specificati per i parametri af, type e protocol .

Per altre informazioni su una sessione multipoint, vedere Multipoint e Semantica multicast .

WSA_FLAG_MULTIPOINT_D_LEAF
0x10
Creare un socket che sarà un d_leaf in una sessione multipunto.

Questo attributo è consentito solo se la struttura WSAPROTOCOL_INFO per il provider di trasporto che crea il socket supporta un meccanismo multipoint o multicast e il piano dati per una sessione multipoint non è rooted. Ciò sarebbe indicato dal membro dwServiceFlags1 della struttura WSAPROTOCOL_INFO con il flag XP1_SUPPORT_MULTIPOINT impostato e il flag XP1_MULTIPOINT_DATA_PLANE non impostato.

Quando il parametro lpProtocolInfo non è NULL, la struttura WSAPROTOCOL_INFO per il provider di trasporto fa riferimento al parametro lpProtocolInfo . Quando il parametro lpProtocolInfo è NULL, la struttura WSAPROTOCOL_INFO si basa sul provider di trasporto selezionato dai valori specificati per i parametri af, type e protocol .

Per altre informazioni su una sessione multipoint, vedere Multipoint e Semantica multicast .

WSA_FLAG_ACCESS_SYSTEM_SECURITY
0x40
Creare un socket che consente di impostare un descrittore di sicurezza nel socket che contiene un elenco di controllo di accesso alla sicurezza (SACL) anziché solo un elenco di controllo di accesso discrezionale (DACL).

Gli elenchi SACL vengono usati per generare controlli e allarmi quando si verifica un controllo di accesso sull'oggetto. Per un socket, viene eseguito un controllo di accesso per determinare se il socket deve essere autorizzato a eseguire l'associazione a un indirizzo specifico specificato alla funzione di associazione .

Il ACCESS_SYSTEM_SECURITY diritto di accesso controlla la possibilità di ottenere o impostare sacl nel descrittore di sicurezza di un oggetto. Il sistema concede questo diritto di accesso solo se il privilegio SE_SECURITY_NAME è abilitato nel token di accesso del thread richiedente.

WSA_FLAG_NO_HANDLE_INHERIT
0x80
Creare un socket non ereditabile.

Un handle socket creato da WSASocket o dalla funzione socket è ereditabile per impostazione predefinita. Quando questo flag è impostato, l'handle del socket non è ereditabile.

La funzione GetHandleInformation può essere usata per determinare se è stato creato un handle socket con il flag WSA_FLAG_NO_HANDLE_INHERIT impostato. La funzione GetHandleInformation restituirà che il valore HANDLE_FLAG_INHERIT è impostato.

Questo flag è supportato in Windows 7 con SP1, Windows Server 2008 R2 con SP1 e versioni successive

 
Importante Per i socket multipunto è possibile specificare solo uno dei flag WSA_FLAG_MULTIPOINT_C_ROOT o WSA_FLAG_MULTIPOINT_C_LEAF e è possibile specificare solo uno dei flag WSA_FLAG_MULTIPOINT_D_ROOT o WSA_FLAG_MULTIPOINT_D_LEAF . Per altre informazioni, vedere Multipoint and Multicast Semantics (Semantica multipoint e Multicast ).
 

Valore restituito

Se non si verifica alcun errore, WSASocket restituisce un descrittore che fa riferimento al nuovo socket. In caso contrario, viene restituito un valore di INVALID_SOCKET e un codice di errore specifico può essere recuperato chiamando WSAGetLastError.

Nota Questa descrizione del codice di errore è specifica di Microsoft.
 
Codice di errore Significato
WSANOTINITIALISED
Prima di usare questa funzione, è necessario che venga eseguita una chiamata WSAStartup riuscita.
WSAENETDOWN
Il sottosistema di rete non è riuscito.
WSAEAFNOSUPPORT
La famiglia di indirizzi specificata non è supportata.
WSAEFAULT
Il parametro lpProtocolInfo non si trova in una parte valida dello spazio indirizzi del processo.
WSAEINPROGRESS
È in corso una chiamata di Windows Sockets 1.1 bloccante oppure il provider di servizi sta ancora elaborando una funzione di callback.
WSAEINVAL
Questo valore è true per una delle condizioni seguenti.
  • Il parametro g specificato non è valido.
  • La struttura WSAPROTOCOL_INFO a cui punta lpProtocolInfo è incompleta, il contenuto non è valido o la struttura WSAPROTOCOL_INFO è già stata usata in un'operazione socket duplicata precedente.
  • I valori specificati per i membri del socket triple <af, type e protocol> sono supportati singolarmente, ma la combinazione specificata non è .
WSAEINVALIDPROVIDER
Il provider di servizi ha restituito una versione diversa dalla 2.2.
WSAEINVALIDPROCTABLE
Il provider di servizi ha restituito una tabella di procedure non valida o incompleta a WSPStartup.
WSAEMFILE
Descrittori di socket esauriti.
WSAENOBUFS
Nessuno spazio di buffer disponibile. Impossibile creare il socket.
WSAEPROTONOSUPPORT
Il protocollo specificato non è supportato.
WSAEPROTOTYPE
Il protocollo specificato è il tipo errato per questo socket.
WSAEPROVIDERFAILEDINIT
Impossibile inizializzare il provider di servizi. Questo errore viene restituito se un provider di servizi a più livelli o un provider di spazi dei nomi è stato installato in modo non corretto o se il provider non funziona correttamente.
WSAESOCKTNOSUPPORT
Il tipo di socket specificato non è supportato in questa famiglia di indirizzi.

Commenti

La funzione WSASocket causa l'allocazione di un descrittore socket e le risorse correlate e l'associazione a un provider di servizi di trasporto. La maggior parte dei socket deve essere creata con l'attributo WSA_FLAG_OVERLAPPED impostato nel parametro dwFlags . Un socket creato con questo attributo supporta l'uso di operazioni di I/O sovrapposte che offrono prestazioni più elevate. Per impostazione predefinita, un socket creato con la funzione WSASocket non avrà questo set di attributi sovrapposti. Al contrario, la funzione socket crea un socket che supporta operazioni di I/O sovrapposte come comportamento predefinito.

Se il parametro lpProtocolInfo è NULL, Winsock utilizzerà il primo provider di servizi di trasporto disponibile che supporta la combinazione richiesta di famiglia di indirizzi, tipo di socket e protocollo specificati nei parametri af, type e protocol .

Se il parametro lpProtocolInfo non è NULL, il socket verrà associato al provider associato alla struttura WSAPROTOCOL_INFO indicata. In questo caso, l'applicazione può fornire la costante manifesto FROM_PROTOCOL_INFO come valore per qualsiasi parametro af, tipo o protocollo . Ciò indica che devono essere considerati i valori corrispondenti della struttura WSAPROTOCOL_INFO indicata (iAddressFamily, iSocketType, iProtocol). In ogni caso, i valori specificati per af, type e protocol vengono passati senza modifiche al provider di servizi di trasporto.

Quando si seleziona un protocollo e il provider di servizi di supporto in base a af, tipo e protocollo, questa procedura sceglierà solo un protocollo di base o una catena di protocolli, non un livello di protocollo da solo. I livelli di protocollo senza portamento non vengono considerati corrispondenti parziali sul tipo o af. Ovvero, non portano a un codice di errore di WSAEAFNOSUPPORT o WSAEPROTONOSUPPORT, se non viene trovato alcun protocollo appropriato.

Nota La costante manifesto AF_UNSPEC continua a essere definita nel file di intestazione, ma il relativo utilizzo è fortemente sconsigliato, perché ciò può causare ambiguità nell'interpretazione del valore del parametro del protocollo .
 
Le applicazioni sono incoraggiate a usare AF_INET6 per il parametro af e creare un socket a doppia modalità che può essere usato sia con IPv4 che con IPv6.

Se un socket viene creato usando la funzione WSASocket , il parametro dwFlags deve avere l'attributo WSA_FLAG_OVERLAPPED impostato per le opzioni socket SO_RCVTIMEO o SO_SNDTIMEO per funzionare correttamente. In caso contrario, il timeout non ha mai effetto sul socket.

I socket orientati alla connessione, ad esempio SOCK_STREAM forniscono connessioni full-duplex, e devono trovarsi in uno stato connesso prima di inviare o ricevere dati su di essi. Viene stabilita una connessione a un socket specificato con una chiamata di funzione connect o WSAConnect . Dopo la connessione, i dati possono essere trasferiti tramite l'invio/ di chiamate WSASend e /WSARecv. Al termine di una sessione, la funzione closesocket deve essere chiamata per rilasciare le risorse associate al socket. Per i socket orientati alla connessione, la funzione di arresto deve essere chiamata per arrestare il trasferimento dei dati sul socket prima di chiamare la funzione closesocket .

I protocolli di comunicazione usati per implementare un socket affidabile orientato alla connessione assicurano che i dati non vengano persi o duplicati. Se i dati per cui il protocollo peer dispone di spazio buffer non possono essere trasmessi correttamente entro un periodo di tempo ragionevole, la connessione viene considerata interrotta e le chiamate successive avranno esito negativo con il codice di errore impostato su WSAETIMEDOUT.

I socket senza connessione orientati ai messaggi consentono l'invio e la ricezione di datagrammi da e verso peer arbitrari tramite sendto/WSASendTo e recvfrom/WSARecvFrom. Se un socket di questo tipo è connesso a un peer specifico, i datagrammi possono essere inviati al peer tramite l'invio/di WSASend e possono essere ricevuti da (solo) questo peer usandoWSARecv/.

Il supporto per i socket con tipo SOCK_RAW non è necessario, ma i provider di servizi sono invitati a supportare socket non elaborati quando possibile.

La funzione WSASocket può essere usata per creare un socket da usare da un servizio in modo che se un altro socket tenta di eseguire l'associazione alla stessa porta usata dal servizio e viene generato il record di controllo. Per abilitare questa opzione, un'applicazione deve eseguire le operazioni seguenti:

  • Chiamare la funzione AdjustTokenPrivileges per abilitare il privilegio SE_SECURITY_NAME nel token di accesso per il processo. Questo privilegio è necessario per impostare i diritti di accesso ACCESS_SYSTEM_SECURITY per il descrittore di sicurezza per un oggetto .
  • Chiamare la funzione WSASocket per creare un socket con dwFlag con il set di opzioni WSA_FLAG_ACCESS_SYSTEM_SECURITY. La funzione WSASocket avrà esito negativo se la funzione AdjustTokenPrivileges non viene chiamata prima per abilitare il privilegio SE_SECURITY_NAME necessario per questa operazione.
  • Chiamare la funzione SetSecurityInfo per impostare un descrittore di sicurezza con un elenco di Controllo di accesso di sistema (SACL) sul socket. L'handle socket restituito dalla funzione WSASocket viene passato nel parametro handle . Se la funzione ha esito positivo, verrà impostato il diritto di accesso ACCESS_SYSTEM_SECURITY sul descrittore di sicurezza per il socket.
  • Chiamare la funzione bind per associare il socket a una porta specifica. Se la funzione di associazione ha esito positivo, viene generata una voce di controllo se un altro socket tenta di eseguire l'associazione alla stessa porta.
  • Chiamare la funzione AdjustTokenPrivileges per rimuovere il privilegio SE_SECURITY_NAME nel token di accesso per il processo, perché non è più necessario.

Per altre informazioni su ACCESS_SYSTEM_SECURITY, vedere SACL Access Right and Audit Generation nella documentazione relativa all'autorizzazione.

Gruppi di socket

WinSock 2 ha introdotto la nozione di gruppo di socket come mezzo per un'applicazione, o un set di applicazioni cooperante, per indicare a un provider di servizi sottostante che un determinato set di socket è correlato e che il gruppo così formato ha determinati attributi. Gli attributi di gruppo includono priorità relative dei singoli socket all'interno del gruppo e una qualità del servizio di gruppo.

Le applicazioni che devono scambiare flussi multimediali in rete sono un esempio in cui poter stabilire una relazione specifica tra un set di socket può essere vantaggioso. Spetta al trasporto su come trattare i gruppi di socket.

Le funzioni WSASocket e WSAAccept possono essere usate per creare e unire in modo esplicito un gruppo di socket durante la creazione di un nuovo socket. È possibile recuperare l'ID del gruppo di socket per un socket usando la funzione getsockopt con il parametro level impostato su SOL_SOCKET e il parametro optname impostato su SO_GROUP_ID. Un gruppo di socket e l'ID del gruppo di socket associato rimangono validi fino alla chiusura dell'ultimo socket appartenente a questo gruppo di socket. Gli ID dei gruppi di socket sono univoci in tutti i processi per un determinato provider di servizi. Un gruppo di socket pari a zero indica che il socket non è membro di un gruppo di socket.

È possibile accedere alla priorità relativa del gruppo di socket usando la funzione getsockopt con il parametro level impostato su SOL_SOCKET e il parametro optname impostato su SO_GROUP_PRIORITY. La priorità relativa del gruppo di un gruppo di socket può essere impostata usando setsockopt con il parametro level impostato su SOL_SOCKET e il parametro optname impostato su SO_GROUP_PRIORITY.

Il provider Winsock incluso in Windows consente la creazione di gruppi di socket e applica il SG_CONSTRAINED_GROUP. Tutti i socket in un gruppo di socket vincolato devono essere creati con lo stesso valore per i parametri di tipo e protocollo . Un gruppo di socket vincolato può essere costituito solo da socket orientati alla connessione e richiede che le connessioni su tutti i socket raggruppati corrispondano allo stesso indirizzo nello stesso host. Questa è l'unica restrizione applicata a un gruppo di socket dal provider Winsock incluso in Windows. La priorità del gruppo di socket non è attualmente usata dal provider Winsock o dallo stack TCP/IP incluso in Windows.

Codice di esempio

Nell'esempio seguente viene illustrato l'uso della funzione WSASocket .
#ifndef UNICODE
#define UNICODE 1
#endif

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

#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#include <stdlib.h>   // Needed for _wtoi


int __cdecl wmain(int argc, wchar_t **argv)
{

    //-----------------------------------------
    // Declare and initialize variables
    WSADATA wsaData = {0};
    int iResult = 0;

//    int i = 1;

    SOCKET sock = INVALID_SOCKET;
    int iFamily = AF_UNSPEC;
    int iType = 0;
    int iProtocol = 0;
    DWORD dwFlags = 0;

    // Validate the parameters
    if (argc != 5) {
        wprintf(L"usage: %s <addressfamily> <type> <protocol> <flags>\n", argv[0]);
        wprintf(L"       opens a socket for the specified family, type, protocol, and flags\n");
        wprintf(L"       flags value must be in decimal, not hex\n");
        wprintf(L"%ws example usage\n", argv[0]);
        wprintf(L"   %ws 0 2 17 1\n", argv[0]);
        wprintf(L"   where AF_UNSPEC=0 SOCK_DGRAM=2 IPPROTO_UDP=17 OVERLAPPED\n", argv[0]);
        return 1;
    }

    iFamily = _wtoi(argv[1]);
    iType = _wtoi(argv[2]);
    iProtocol = _wtoi(argv[3]);
    dwFlags = _wtoi(argv[4]);
    
    // Initialize Winsock
    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != 0) {
        wprintf(L"WSAStartup failed: %d\n", iResult);
        return 1;
    }

    wprintf(L"Calling socket with following parameters:\n");
    wprintf(L"  Address Family = ");
    switch (iFamily) {
    case AF_UNSPEC:
        wprintf(L"Unspecified");
        break;
    case AF_INET:
        wprintf(L"AF_INET (IPv4)");
        break;
    case AF_INET6:
        wprintf(L"AF_INET6 (IPv6)");
        break;
    case AF_NETBIOS:
        wprintf(L"AF_NETBIOS (NetBIOS)");
        break;
    case AF_BTH:
        wprintf(L"AF_BTH (Bluetooth)");
        break;
    default:
        wprintf(L"Other");
        break;
    }
    wprintf(L" (%d)\n", iFamily);
    
    wprintf(L"  Socket type = ");
    switch (iType) {
    case 0:
        wprintf(L"Unspecified");
        break;
    case SOCK_STREAM:
        wprintf(L"SOCK_STREAM (stream)");
        break;
    case SOCK_DGRAM:
        wprintf(L"SOCK_DGRAM (datagram)");
        break;
    case SOCK_RAW:
        wprintf(L"SOCK_RAW (raw)");
        break;
    case SOCK_RDM:
        wprintf(L"SOCK_RDM (reliable message datagram)");
        break;
    case SOCK_SEQPACKET:
        wprintf(L"SOCK_SEQPACKET (pseudo-stream packet)");
        break;
    default:
        wprintf(L"Other");
        break;
    }
    wprintf(L" (%d)\n", iType);

    wprintf(L"  Protocol = %d = ", iProtocol);
    switch (iProtocol) {
    case 0:
        wprintf(L"Unspecified");
        break;
    case IPPROTO_ICMP:
        wprintf(L"IPPROTO_ICMP (ICMP)");
        break;
    case IPPROTO_IGMP:
        wprintf(L"IPPROTO_IGMP (IGMP)");
        break;
    case IPPROTO_TCP:
        wprintf(L"IPPROTO_TCP (TCP)");
        break;
    case IPPROTO_UDP:
        wprintf(L"IPPROTO_UDP (UDP)");
        break;
    case IPPROTO_ICMPV6:
        wprintf(L"IPPROTO_ICMPV6 (ICMP Version 6)");
        break;
    default:
        wprintf(L"Other");
        break;
    }
    wprintf(L" (%d)\n", iProtocol);

    wprintf(L"  Flags = ");
    if (dwFlags & WSA_FLAG_OVERLAPPED)
        wprintf(L"  WSA_FLAG_OVERLAPPED");
    if (dwFlags & WSA_FLAG_MULTIPOINT_C_ROOT)
        wprintf(L"  WSA_FLAG_MULTIPOINT_C_ROOT");
    if (dwFlags & WSA_FLAG_MULTIPOINT_C_LEAF)
        wprintf(L"  WSA_FLAG_MULTIPOINT_C_LEAF");
    if (dwFlags & WSA_FLAG_MULTIPOINT_D_ROOT)
        wprintf(L"  WSA_FLAG_MULTIPOINT_D_ROOT");
    if (dwFlags & WSA_FLAG_MULTIPOINT_D_LEAF)
        wprintf(L"  WSA_FLAG_MULTIPOINT_D_LEAF");
    if (dwFlags & WSA_FLAG_ACCESS_SYSTEM_SECURITY)
        wprintf(L"  WSA_FLAG_ACCESS_SYSTEM_SECURITY");
#ifdef WSA_FLAG_NO_HANDLE_INHERIT 
    if (dwFlags & WSA_FLAG_NO_HANDLE_INHERIT)
        wprintf(L"  WSA_FLAG_NO_HANDLE_INHERIT");
#endif
    wprintf(L" (0x%x)\n" , dwFlags);

    sock = WSASocket(iFamily, iType, iProtocol, NULL, 0, dwFlags);
    if (sock == INVALID_SOCKET) 
        wprintf(L"WSASocket function failed with error = %d\n", WSAGetLastError() );
    else {
        wprintf(L"WSASocket function succeeded\n");

        // Close the socket to release the resources associated
        // Normally an application calls shutdown() before closesocket 
        //   to  disables sends or receives on a socket first
        // This isn't needed in this simple sample
        iResult = closesocket(sock);
        if (iResult == SOCKET_ERROR) {
            wprintf(L"closesocket function zfailed with error = %d\n", WSAGetLastError() );
            WSACleanup();
            return 1;
        }    
    }
    WSACleanup();

    return 0;
}


Windows Phone 8: la funzione WSASocketW è supportata per le app dello Store Windows Phone in Windows Phone 8 e versioni successive.

Windows 8.1 e Windows Server 2012 R2: la funzione WSASocketW è supportata per le app di Windows Store in Windows 8.1, Windows Server 2012 R2 e versioni successive.

Nota

L'intestazione winsock2.h definisce WSASocket come alias che seleziona automaticamente la versione ANSI o Unicode di questa funzione in base alla definizione della costante del preprocessore UNICODE. La combinazione dell'utilizzo dell'alias indipendente dalla codifica con il codice che non è indipendente dalla codifica può causare mancate corrispondenze che generano errori di compilazione o di runtime. Per altre informazioni, vedere Convenzioni per i prototipi di funzioni.

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

WSAPROTOCOL_INFO

Funzioni Winsock

Informazioni di riferimento su Winsock

Accettare

bind

closesocket

connect

getsockname

getsockopt

ioctlsocket

listen

Recv

recvfrom

select

send

Sendto

Setsockopt

shutdown

socket