Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Dopo l'inizializzazione, è necessario istanziare un oggetto SOCKET per l'uso da parte del 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 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; }
Creare un oggetto SOCKET denominato ConnectSocket.
SOCKET ConnectSocket = INVALID_SOCKET;
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);
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
Argomenti correlati