Share via


Creación de un socket para el servidor

Después de la inicialización, se debe crear una instancia de un objeto SOCKET para que lo use el servidor.

Para crear un socket para el servidor

  1. La función getaddrinfo se usa para determinar los valores de la estructura sockaddr :

    • AF_INET se usa para especificar la familia de direcciones IPv4.
    • SOCK_STREAM se usa para especificar un socket de flujo.
    • IPPROTO_TCP se usa para especificar el protocolo TCP .
    • AI_PASSIVE marca indica que el llamador pretende usar la estructura de direcciones de socket devuelta en una llamada a la función bind . Cuando la marca AI_PASSIVE se establece y el parámetro nodename en la función getaddrinfo es un puntero NULL , la parte de la dirección IP de la estructura de direcciones de socket se establece en INADDR_ANY para las direcciones IPv4 o IN6ADDR_ANY_INIT para las direcciones IPv6.
    • 27015 es el número de puerto asociado al servidor al que se conectará el cliente.

    La función getaddrinfo usa la estructura addrinfo.

    #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. Cree un objeto SOCKET denominado ListenSocket para que el servidor escuche las conexiones de cliente.

    SOCKET ListenSocket = INVALID_SOCKET;
    
  3. Llame a la función socket y devuelva su valor a la variable ListenSocket. Para esta aplicación de servidor, use la primera dirección IP devuelta por la llamada a getaddrinfo que coincida con la familia de direcciones, el tipo de socket y el protocolo especificados en el parámetro hints . En este ejemplo, se solicitó un socket de flujo TCP para IPv4 con una familia de direcciones IPv4, un tipo de socket de SOCK_STREAM y un protocolo de IPPROTO_TCP. Por lo tanto, se solicita una dirección IPv4 para ListenSocket.

    Si la aplicación de servidor quiere escuchar en IPv6, la familia de direcciones debe establecerse en AF_INET6 en el parámetro hints . Si un servidor quiere escuchar en IPv6 e IPv4, se deben crear dos sockets de escucha, uno para IPv6 y otro para IPv4. La aplicación debe controlar estos dos sockets por separado.

    Windows Vista y versiones posteriores ofrecen la capacidad de crear un único socket IPv6 que se coloca en modo de pila dual para escuchar tanto en IPv6 como en IPv4. Para obtener más información sobre esta característica, consulte Sockets de pila dual.

    // Create a SOCKET for the server to listen for client connections
    
    ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);
    
  4. Compruebe si hay errores para asegurarse de que el socket es un socket válido.

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

Paso siguiente: Enlazar un socket

Introducción con Winsock

Inicialización de Winsock

Aplicación de servidor Winsock