Condividi tramite


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
AF_UNSPEC
0
La famiglia di indirizzi non è specificata.
AF_INET
2
Famiglia di indirizzi IPv4 (Internet Protocol versione 4).
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 è 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.

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

Questa famiglia di indirizzi è supportata solo se nel computer è installata una porta e un driver a infrarossi.

AF_BTH
32
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
SOCK_STREAM
1
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).
SOCK_DGRAM
2
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).
SOCK_RAW
3
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.
SOCK_RDM
4
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.

SOCK_SEQPACKET
5
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.

protocol Significato
IPPROTO_ICMP
1
Protocollo ICMP (Internet Control Message 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.

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.

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
WSANOTINITIALISED
Prima di usare questa funzione, è necessario che venga eseguita una chiamata WSAStartup riuscita.
WSAENETDOWN
Il sottosistema di rete o il provider di servizi associato non è riuscito.
WSAEAFNOSUPPORT
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.
WSAEINPROGRESS
È in corso una chiamata di Windows Sockets 1.1 bloccante oppure il provider di servizi sta ancora elaborando una funzione di callback.
WSAEMFILE
Descrittori di socket esauriti.
WSAEINVAL
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.
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.
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 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.

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.

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.

Nota In Windows NT, il supporto dei socket non elaborati richiede privilegi amministrativi.
 
Un socket con un parametro di tipodi SOCK_SEQPACKET si basa su datagrammi, ma funziona come protocollo pseudo-flusso. Sia per i pacchetti di invio che per la ricezione, vengono usati datagrammi separati. Tuttavia, Windows Sockets può unire più pacchetti di ricezione in un singolo pacchetto. Un'applicazione può quindi eseguire una chiamata di ricezione (ad esempio, recv o WSARecvEx) e recuperare i dati da più pacchetti uniti in una singola chiamata. La famiglia di indirizzi AF_NETBIOS supporta un parametro di tipo di SOCK_SEQPACKET.

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.
Un socket da utilizzare con la famiglia di indirizzi AF_IRDA può essere creato solo se nel computer locale è installata una porta e un driver a infrarossi. In caso contrario, una chiamata alla funzione socket con il parametro af impostato su AF_IRDA avrà esito negativo e WSAGetLastError restituirà WSAEPROTONOSUPPORT.

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

Opzioni socket IPPROTO_IP

Opzioni socket IPPROTO_IPV6

Programmazione multicast affidabile

WSASocket

Funzioni Winsock

Informazioni di riferimento su Winsock

Accettare

bind

closesocket

connect

getsockname

getsockopt

ioctlsocket

listen

Recv

recvfrom

select

send

Sendto

Setsockopt

shutdown