Condividi tramite


Creazione di un socket per il client

Dopo l'inizializzazione, è necessario istanziare un oggetto SOCKET per l'uso da parte del 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_UNSPEC;
    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 sul server a cui il client si connetterà è definita da DEFAULT_PORT come 27015 in questo esempio. La funzione getaddrinfo restituisce il relativo valore come numero intero controllato per la presenza di 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 suo valore alla variabile ConnectSocket. Per questa applicazione, usare il primo indirizzo IP restituito dalla chiamata a getaddrinfo che corrisponde alla famiglia di indirizzi, al tipo di socket e al protocollo specificati 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 la presenza di errori per accertarsi che il socket sia valido.

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

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

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

Nota

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

Ad esempio, l'impostazione di 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) specifico.

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

Passaggio successivo: connessione a un socket

Introduzione a Winsock

inizializzazione di Winsock

Applicazione Client Winsock