Partilhar via


Criando um soquete para o servidor

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

Para criar um soquete para o servidor

  1. A função getaddrinfo é usada para determinar os valores na estrutura sockaddr.

    • AF_INET é usado para especificar a família de endereços IPv4.
    • SOCK_STREAM é usado para especificar um soquete de fluxo.
    • IPPROTO_TCP é usado para especificar o protocolo TCP .
    • AI_PASSIVE indicador indica que o chamador pretende usar a estrutura de endereço de soquete retornada numa invocação da função bind. Quando o sinalizador AI_PASSIVE está definido e o parâmetro nodename para a função getaddrinfo é um ponteiro NULL, a parte do endereço IP da estrutura de endereços do soquete é definida como INADDR_ANY para endereços IPv4 ou IN6ADDR_ANY_INIT para endereços IPv6.
    • 27015 é o número da porta associado ao servidor ao qual o cliente se conectará.

    A estrutura addrinfo é usada pela funçãogetaddrinfo.

    #define DEFAULT_PORT "27015"
    
    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;
    hints.ai_flags = AI_PASSIVE;
    
    // Resolve the local address and port to be used by the server
    iResult = getaddrinfo(NULL, DEFAULT_PORT, &hints, &result);
    if (iResult != 0) {
        printf("getaddrinfo failed: %d\n", iResult);
        WSACleanup();
        return 1;
    }
    
  2. Crie um objeto SOCKET chamado ListenSocket para que o servidor ouça as conexões dos clientes.

    SOCKET ListenSocket = INVALID_SOCKET;
    
  3. Chame a função de soquete e retorne o seu valor para a variável ListenSocket. Para esta aplicação de servidor, 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 de dicas . Neste exemplo, um soquete de fluxo TCP para IPv4 foi solicitado com uma família de endereços IPv4, um tipo de soquete de SOCK_STREAM e um protocolo de IPPROTO_TCP. Portanto, um endereço IPv4 é solicitado para o ListenSocket.

    Se o aplicativo de servidor quiser escutar no IPv6, a família de endereços precisa ser definida para AF_INET6 no parâmetro dicas. Se um servidor quiser escutar em IPv6 e IPv4, dois soquetes de escuta devem ser criados, um para IPv6 e outro para IPv4. Esses dois soquetes devem ser manipulados separadamente pelo aplicativo.

    O Windows Vista e versões posteriores oferecem a capacidade de criar um único soquete IPv6 que é colocado no modo de pilha dupla para escutar em IPv6 e IPv4. Para obter mais informações sobre esse recurso, consulte Dual-Stack Sockets.

    // Create a SOCKET for the server to listen for client connections
    
    ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
    
  4. Verifique se há erros para garantir que o soquete seja um soquete válido.

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

Próxima etapa: vinculando um soquete

Introdução ao Winsock

inicializando o Winsock

Winsock Server Application