Share via


Creazione di un socket per il client

Dopo l'inizializzazione, è necessario creare un'istanza di un oggetto SOCKET per l'uso dal client.

Per creare un socket

  1. Dichiarare un oggetto addrinfo che contiene una struttura sockaddr e inizializzare questi valori. Per questa applicazione, la famiglia di indirizzi Internet non è specificata in modo che sia possibile restituire un indirizzo IPv6 o IPv4. L'applicazione richiede che il tipo di socket sia un socket di flusso per il protocollo TCP.

    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;
    
  2. Chiamare la funzione getaddrinfo che richiede l'indirizzo IP per il nome del server passato nella riga di comando. La porta TCP nel server a cui si connette il client è definita da DEFAULT_PORT come 27015 in questo esempio. La funzione getaddrinfo restituisce il relativo valore come intero controllato per gli errori.

    #define DEFAULT_PORT "27015"
    
    // Resolve the server address and port
    iResult = getaddrinfo(argv[1], DEFAULT_PORT, &hints, &result);
    if (iResult != 0) {
        printf("getaddrinfo failed: %d\n", iResult);
        WSACleanup();
        return 1;
    }
    
  3. Creare un oggetto SOCKET denominato ConnectSocket.

    SOCKET ConnectSocket = INVALID_SOCKET;
    
  4. Chiamare la funzione socket e restituire il relativo valore alla variabile ConnectSocket. Per questa applicazione, usare il primo indirizzo IP restituito dalla chiamata per ottenereaddrinfo corrispondente alla famiglia di indirizzi, al tipo di socket e al protocollo specificato nel parametro hint . In questo esempio è stato specificato un socket di flusso TCP con un tipo di socket di SOCK_STREAM e un protocollo di IPPROTO_TCP. La famiglia di indirizzi non è stata specificata (AF_UNSPEC), quindi l'indirizzo IP restituito potrebbe essere un indirizzo IPv6 o IPv4 per il server.

    Se l'applicazione client vuole connettersi usando solo IPv6 o IPv4, la famiglia di indirizzi deve essere impostata su AF_INET6 per IPv6 o AF_INET per IPv4 nel parametro hint .

    // Attempt to connect to the first address returned by
    // the call to getaddrinfo
    ptr=result;
    
    // Create a SOCKET for connecting to server
    ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype, 
        ptr->ai_protocol);
    
  5. Verificare gli errori per assicurarsi che il socket sia un socket valido.

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

I parametri passati alla funzione socket possono essere modificati per implementazioni diverse.

Il rilevamento degli errori è una parte fondamentale del codice di rete riuscito. Se la chiamata socket ha esito negativo, restituisce INVALID_SOCKET. L'istruzione if nel codice precedente viene usata per rilevare eventuali errori che potrebbero verificarsi durante la creazione del socket. WSAGetLastError restituisce un numero di errore associato all'ultimo errore che si è verificato.

Nota

Il controllo degli errori più completo può essere necessario a seconda dell'applicazione.

Ad esempio, l'impostazione hints.ai_family su AF_UNSPEC può causare l'esito negativo della chiamata di connessione. In tal caso, usare invece un valore IPv4 (AF_INET) o IPv6 (AF_INET6).

WSACleanup viene usato per terminare l'uso della DLL WS2_32.

Passaggio successivo: connessione a un socket

Introduzione con Winsock

Inizializzazione di Winsock

Applicazione client Winsock