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 |
---|---|
|
La famiglia di indirizzi non è specificata. |
|
Famiglia di indirizzi Internet Protocol versione 4 (IPv4). |
|
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. |
|
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. |
|
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. |
|
Famiglia di indirizzi IPv6 (Internet Protocol 6). |
|
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. |
|
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 |
---|---|
|
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). |
|
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). |
|
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. |
|
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. |
|
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.
[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.
[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 |
---|---|
|
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. |
|
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 . |
|
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 . |
|
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 . |
|
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 . |
|
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. |
|
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 |
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.
Codice di errore | Significato |
---|---|
Prima di usare questa funzione, è necessario che venga eseguita una chiamata WSAStartup riuscita. | |
Il sottosistema di rete non è riuscito. | |
La famiglia di indirizzi specificata non è supportata. | |
Il parametro lpProtocolInfo non si trova in una parte valida dello spazio indirizzi del processo. | |
È in corso una chiamata di Windows Sockets 1.1 bloccante oppure il provider di servizi sta ancora elaborando una funzione di callback. | |
Questo valore è true per una delle condizioni seguenti.
|
|
Il provider di servizi ha restituito una versione diversa dalla 2.2. | |
Il provider di servizi ha restituito una tabella di procedure non valida o incompleta a WSPStartup. | |
Descrittori di socket esauriti. | |
Nessuno spazio di buffer disponibile. Impossibile creare il socket. | |
Il protocollo specificato non è supportato. | |
Il protocollo specificato è il tipo errato per questo socket. | |
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. | |
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.
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 |