Partilhar 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 addrinfo objeto que contenha uma estrutura sockaddr e inicialize esses valores. Para este 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_UNSPEC;
    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 o seu valor para a variável ConnectSocket. Para esta aplicação, 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 especificado 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 foi deixada não especificada (AF_UNSPEC), portanto, o endereço IP retornado poderia 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 precisa ser definida como AF_INET6 para IPv6 ou AF_INET para IPv4 no parâmetro dicas.

    // 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 dede socketpodem ser alterados para diferentes implementações.

A deteção de erros é uma parte fundamental do código de rede bem-sucedido. Se a chamada do socket falhar, retorna INVALID_SOCKET. A instrução se no código anterior é usada para detectar quaisquer erros que possam ter ocorrido durante a criação do soquete. WSAGetLastError retorna um número de erro associado ao último erro que ocorreu.

Observação

Pode ser necessária uma verificação de erros mais extensa, dependendo da aplicação.

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

WSACleanup é usado para encerrar o uso da WS2_32 DLL.

Próxima etapa: ligação a um soquete

Introdução ao Winsock

inicializando o Winsock

Aplicativo Cliente Winsock