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
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;
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; }
Creare un oggetto SOCKET denominato ConnectSocket.
SOCKET ConnectSocket = INVALID_SOCKET;
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);
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
Argomenti correlati