Funzione socket (winsock2.h)
La funzione socket crea un socket associato a un provider di servizi di trasporto specifico.
Sintassi
SOCKET WSAAPI socket(
[in] int af,
[in] int type,
[in] int protocol
);
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 possibili valori per la famiglia di indirizzi sono definiti nel file di intestazione Ws2def.h. Si noti che il file di intestazione Ws2def.h viene automaticamente incluso 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 PF_ sono identiche (ad esempio, AF_INET e PF_INET), in modo che sia possibile usare entrambe le costanti.
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 IPv4 (Internet Protocol versione 4). |
|
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 è installato il provider Windows Sockets per NetBIOS.
Il provider Windows Sockets per NetBIOS è supportato nelle 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 nelle 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 versione 6). |
|
Famiglia di indirizzi IrDA (Infrared Data Association).
Questa famiglia di indirizzi è supportata solo se nel computer è installata una porta e un driver a infrarossi. |
|
Famiglia di indirizzi Bluetooth.
Questa famiglia di indirizzi è supportata in Windows XP con SP2 o versione successiva se nel computer è installata una scheda Bluetooth e un driver. |
[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 .
La tabella seguente elenca i valori possibili per il parametro di tipo supportato per Windows Sockets 2:
Type | Significato |
---|---|
|
Tipo di socket che fornisce flussi di byte sequenziati, affidabili, bidirezionali e basati sulla connessione con un meccanismo di trasmissione dei 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 datagrammi, che non sono connectionless, 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 superiore successiva. Per modificare l'intestazione IPv4, è necessario impostare l'opzione IP_HDRINCL socket sul socket. Per modificare l'intestazione IPv6, l'opzione socket IPV6_HDRINCL deve essere impostata sul socket. |
|
Tipo di socket che fornisce un datagramma di messaggi affidabile. Un esempio di questo tipo è l'implementazione del protocollo multicast generale pragmatico (PGM) 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 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 protocollo e tipo di socket 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 quando vengono definiti nuovi tipi di socket, famiglie di indirizzi e protocolli.
In Windows Sockets 1.1, gli unici tipi di socket possibili sono SOCK_DGRAM e SOCK_STREAM.
[in] protocol
Protocollo da utilizzare. Le opzioni possibili per il parametro del protocollo sono specifiche per la famiglia di indirizzi e il tipo di socket specificati. 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 automaticamente incluso 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 viene 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.
Valore restituito
Se non si verifica alcun errore, socket 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 o il provider di servizi associato non è riuscito. | |
La famiglia di indirizzi specificata non è supportata. Ad esempio, un'applicazione ha tentato di creare un socket per la famiglia di indirizzi AF_IRDA , ma non è installato un adattatore a infrarossi e un driver di dispositivo nel computer locale. | |
È in corso una chiamata di Windows Sockets 1.1 bloccante oppure il provider di servizi sta ancora elaborando una funzione di callback. | |
Descrittori di socket esauriti. | |
Argomento fornito non valido. Questo errore viene restituito se il parametro af è impostato su AF_UNSPEC e il tipo e il parametro del protocollo non sono specificati. | |
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. | |
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 socket causa l'allocazione di un descrittore socket e le risorse correlate e l'associazione a un provider di servizi di trasporto specifico. Winsock utilizzerà il primo provider di servizi disponibile che supporta la combinazione richiesta di parametri della famiglia di indirizzi, del tipo di socket e del protocollo. Il socket creato avrà l'attributo sovrapposto come impostazione predefinita. Per Windows, l'opzione socket specifica di Microsoft, SO_OPENTYPE, definita in Mswsock.h può influire su questo valore predefinito. Per una descrizione dettagliata delle SO_OPENTYPE, vedere la documentazione specifica di Microsoft.
I socket senza l'attributo sovrapposto possono essere creati usando WSASocket. Tutte le funzioni che consentono operazioni sovrapposte (WSASend, WSARecv, WSASendTo, WSARecvFrom e WSAIoctl) supportano anche l'utilizzo non sovrapposto in un socket sovrapposto se i valori per i parametri correlati all'operazione sovrapposta sono NULL.
Quando si seleziona un protocollo e il provider di servizi di supporto, 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.
I socket orientati alla connessione, ad esempio SOCK_STREAM forniscono connessioni full duplex, e devono trovarsi in uno stato connesso prima di poter inviare o ricevere dati su di esso. Viene creata una connessione a un altro socket con una chiamata di connessione . Una volta connessi, i dati possono essere trasferiti usando chiamate di invio e recupero . Al termine di una sessione, è necessario eseguire un 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 usando sendto e recvfrom. Se un socket di questo tipo è connesso a un peer specifico, i datagrammi possono essere inviati a tale peer usando send e possono essere ricevuti solo da questo peer usando recv.
IPv6 e IPv4 funzionano in modo diverso quando si riceve un socket con un tipo di SOCK_RAW. Il pacchetto di ricezione IPv4 include il payload del pacchetto, l'intestazione di livello superiore successiva (ad esempio, l'intestazione IP per un pacchetto TCP o UDP) e l'intestazione del pacchetto IPv4. Il pacchetto di ricezione IPv6 include il payload del pacchetto e l'intestazione di livello superiore successiva. Il pacchetto di ricezione IPv6 non include mai l'intestazione del pacchetto IPv6.
Quando il parametro af è AF_NETBIOS per NetBIOS su TCP/IP, il parametro di tipo può essere SOCK_DGRAM o SOCK_SEQPACKET. Per la famiglia di indirizzi AF_NETBIOS , il parametro del protocollo è il numero di adattatore LAN rappresentato come numero negativo.
In Windows XP e versioni successive è possibile usare il comando seguente per elencare il catalogo Di Windows Sockets per determinare i provider di servizi installati e la famiglia di indirizzi, il tipo di socket e i protocolli supportati.
netsh winsock show catalog
Il supporto per i socket con tipo SOCK_RAW non è necessario, ma i provider di servizi sono invitati a supportare socket non elaborati come praticabili.
Note per i socket IrDA
Tenere presente quanto segue:- Il file di intestazione Af_irda.h deve essere incluso in modo esplicito.
- È supportato solo SOCK_STREAM ; il tipo SOCK_DGRAM non è supportato da IrDA.
- Il parametro del protocollo è sempre impostato su 0 per IrDA.
Codice di esempio
Nell'esempio seguente viene illustrato l'uso della funzione socket per creare un socket associato a un provider di servizi di trasporto specifico.#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;
// Validate the parameters
if (argc != 4) {
wprintf(L"usage: %s <addressfamily> <type> <protocol>\n", argv[0]);
wprintf(L"socket opens a socket for the specified family, type, & protocol\n");
wprintf(L"%ws example usage\n", argv[0]);
wprintf(L" %ws 0 2 17\n", argv[0]);
wprintf(L" where AF_UNSPEC=0 SOCK_DGRAM=2 IPPROTO_UDP=17\n", argv[0]);
return 1;
}
iFamily = _wtoi(argv[1]);
iType = _wtoi(argv[2]);
iProtocol = _wtoi(argv[3]);
// 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);
sock = socket(iFamily, iType, iProtocol);
if (sock == INVALID_SOCKET)
wprintf(L"socket function failed with error = %d\n", WSAGetLastError() );
else {
wprintf(L"socket 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 failed with error = %d\n", WSAGetLastError() );
WSACleanup();
return 1;
}
}
WSACleanup();
return 0;
}
Windows Phone 8: questa funzione è supportata per le app dello Store di Windows Phone in Windows Phone 8 e versioni successive.
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
Programmazione multicast affidabile