Condividi tramite


Creazione di un socket per il server

Dopo l'inizializzazione, è necessario creare un'istanza di un oggetto SOCKET per l'uso da parte del server.

Per creare un socket per il server

  1. La funzione getaddrinfo viene usata per determinare i valori nella struttura sockaddr :

    • AF_INET viene usato per specificare la famiglia di indirizzi IPv4.
    • SOCK_STREAM viene usato per specificare un socket di flusso.
    • IPPROTO_TCP viene usato per specificare il protocollo TCP .
    • AI_PASSIVE flag indica che il chiamante intende utilizzare la struttura di indirizzi socket restituita in una chiamata alla funzione di associazione . Quando il flag AI_PASSIVE è impostato e il parametro nodename per la funzione getaddrinfo è un puntatore NULL , la parte dell'indirizzo IP della struttura degli indirizzi socket viene impostata su INADDR_ANY per gli indirizzi IPv4 o IN6ADDR_ANY_INIT per gli indirizzi IPv6.
    • 27015 è il numero di porta associato al server a cui si connetterà il client.

    La struttura addrinfo viene usata dalla funzione getaddrinfo .

    #define DEFAULT_PORT "27015"
    
    struct addrinfo *result = NULL, *ptr = NULL, hints;
    
    ZeroMemory(&hints, sizeof (hints));
    hints.ai_family = AF_INET;
    hints.ai_socktype = SOCK_STREAM;
    hints.ai_protocol = IPPROTO_TCP;
    hints.ai_flags = AI_PASSIVE;
    
    // Resolve the local address and port to be used by the server
    iResult = getaddrinfo(NULL, DEFAULT_PORT, &hints, &result);
    if (iResult != 0) {
        printf("getaddrinfo failed: %d\n", iResult);
        WSACleanup();
        return 1;
    }
    
  2. Creare un oggetto SOCKET denominato ListenSocket per il server in ascolto delle connessioni client.

    SOCKET ListenSocket = INVALID_SOCKET;
    
  3. Chiamare la funzione socket e restituirne il valore alla variabile ListenSocket. Per questa applicazione server, usare il primo indirizzo IP restituito dalla chiamata a getaddrinfo corrispondente alla famiglia di indirizzi, al tipo di socket e al protocollo specificati nel parametro hints . In questo esempio è stato richiesto un socket di flusso TCP per IPv4 con una famiglia di indirizzi IPv4, un tipo di socket di SOCK_STREAM e un protocollo di IPPROTO_TCP. Viene quindi richiesto un indirizzo IPv4 per listenSocket.

    Se l'applicazione server vuole rimanere in ascolto su IPv6, la famiglia di indirizzi deve essere impostata su AF_INET6 nel parametro hints . Se un server vuole rimanere in ascolto sia su IPv6 che su IPv4, è necessario creare due socket di ascolto, uno per IPv6 e uno per IPv4. Questi due socket devono essere gestiti separatamente dall'applicazione.

    Windows Vista e versioni successive offrono la possibilità di creare un singolo socket IPv6 in modalità dual stack per l'ascolto sia su IPv6 che su IPv4. Per altre informazioni su questa funzionalità, vedere Dual-Stack Sockets.

    // Create a SOCKET for the server to listen for client connections
    
    ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
    
  4. Verificare la presenza di errori per assicurarsi che il socket sia un socket valido.

    if (ListenSocket == INVALID_SOCKET) {
        printf("Error at socket(): %ld\n", WSAGetLastError());
        freeaddrinfo(result);
        WSACleanup();
        return 1;
    }
    

Passaggio successivo: Associazione di un socket

Introduzione con Winsock

Inizializzazione di Winsock

Applicazione server Winsock