Compartilhar via


Criando um soquete para o cliente

Após a inicialização, um objeto SOCKET deve ser instanciado para uso pelo cliente.

Para criar um soquete

  1. Declare um objeto addrinfo que contém uma estrutura sockaddr e inicialize esses valores. Para esse aplicativo, a família de endereços da Internet não é especificada para que um endereço IPv6 ou IPv4 possa ser retornado. O aplicativo solicita que o tipo de soquete seja um soquete de fluxo para o protocolo 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. Chame a função getaddrinfo solicitando o endereço IP para o nome do servidor passado na linha de comando. A porta TCP no servidor ao qual o cliente se conectará é definida por DEFAULT_PORT como 27015 neste exemplo. A função getaddrinfo retorna seu valor como um inteiro que é verificado quanto a erros.

    #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. Crie um objeto SOCKET chamado ConnectSocket.

    SOCKET ConnectSocket = INVALID_SOCKET;
    
  4. Chame a função de soquete e retorne seu valor para a variável ConnectSocket. Para esse aplicativo, use o primeiro endereço IP retornado pela chamada para getaddrinfo que corresponda à família de endereços, ao tipo de soquete e ao protocolo especificados no parâmetro hints . Neste exemplo, um soquete de fluxo TCP foi especificado com um tipo de soquete de SOCK_STREAM e um protocolo de IPPROTO_TCP. A família de endereços não foi especificada (AF_UNSPEC), portanto, o endereço IP retornado pode ser um endereço IPv6 ou IPv4 para o servidor.

    Se o aplicativo cliente quiser se conectar usando apenas IPv6 ou IPv4, a família de endereços precisará ser definida como AF_INET6 para IPv6 ou AF_INET para IPv4 no parâmetro hints .

    // 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. Verifique se há erros para garantir que o soquete seja um soquete válido.

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

Os parâmetros passados para a função de soquete podem ser alterados para implementações diferentes.

A detecção de erros é uma parte fundamental do código de rede bem-sucedido. Se a chamada de soquete falhar, ela retornará INVALID_SOCKET. A instrução if no código anterior é usada para capturar erros que possam ter ocorrido durante a criação do soquete. WSAGetLastError retorna um número de erro associado ao último erro ocorrido.

Observação

Uma verificação de erro mais abrangente pode ser necessária dependendo do aplicativo.

Por exemplo, definir hints.ai_familycomo AF_UNSPEC pode fazer com que a chamada de conexão falhe. Se isso acontecer, use um valor específico de IPv4 (AF_INET) ou IPv6 (AF_INET6).

O WSACleanup é usado para encerrar o uso da DLL WS2_32.

Próxima etapa: Conectar-se a um soquete

Introdução com Winsock

Inicializando Winsock

Aplicativo cliente Winsock