Compartir a través de


Aceptar una conexión (Windows Sockets 2)

Una vez que el socket está escuchando una conexión, el programa debe controlar las solicitudes de conexión en ese socket.

Para aceptar una conexión en un socket

  1. Cree un objeto SOCKET temporal denominado ClientSocket para aceptar conexiones de clientes.

    
    SOCKET ClientSocket;
    
    
    
  2. Normalmente, una aplicación de servidor se diseñaría para escuchar conexiones de varios clientes. En el caso de los servidores de alto rendimiento, se suelen usar varios subprocesos para controlar las conexiones de varios clientes.

    Hay varias técnicas de programación diferentes mediante Winsock que se pueden usar para escuchar varias conexiones de cliente. Una técnica de programación consiste en crear un bucle continuo que comprueba si hay solicitudes de conexión mediante la función escucha (consulte Escucha en un socket). Si se produce una solicitud de conexión, la aplicación llama a la función accept, la función AcceptEx, o la función WSAAccept y pasa el trabajo a otro subproceso para gestionar la solicitud. Se pueden realizar otras técnicas de programación.

    Tenga en cuenta que este ejemplo básico es muy sencillo y no usa varios subprocesos. En el ejemplo también se escucha y acepta únicamente una conexión.

    
    ClientSocket = INVALID_SOCKET;
    
    // Accept a client socket
    ClientSocket = accept(ListenSocket, NULL, NULL);
    if (ClientSocket == INVALID_SOCKET) {
        printf("accept failed: %d\n", WSAGetLastError());
        closesocket(ListenSocket);
        WSACleanup();
        return 1;
    }
    
    
    
  3. Cuando se ha aceptado la conexión de cliente, una aplicación de servidor normalmente pasaría el socket de cliente aceptado (la variable ClientSocket en el código de ejemplo anterior) a un subproceso de trabajo o un puerto de finalización de E/S y seguir aceptando conexiones adicionales. En este ejemplo básico, el servidor continúa con el paso siguiente.

    Hay una serie de otras técnicas de programación que se pueden usar para escuchar y aceptar varias conexiones. Esto incluyen el uso de las funciones select o WSAPoll. Algunos ejemplos de estas diversas técnicas de programación se ilustran en los Ejemplos Avanzados de Winsock, que se incluyen con el Kit de Desarrollo de Software de Microsoft Windows (SDK).

    Nota

    En los sistemas Unix, una técnica de programación común para los servidores era que una aplicación escuchara conexiones. Al aceptar una conexión, el proceso primario llamaría a la función fork para crear un nuevo proceso secundario para controlar la conexión de cliente, heredando el socket del elemento primario. Esta técnica de programación no se admite en Windows, ya que no se admite la función de bifurcación . Esta técnica tampoco suele ser adecuada para servidores de alto rendimiento, ya que los recursos necesarios para crear un nuevo proceso son mucho mayores que los necesarios para un subproceso.

Una vez que se llama a la función accept, el ListenSocket ya no es necesario para este ejemplo. Se llama a la función closesocket para cerrar el socket.

    // No longer need server socket
    closesocket(ListenSocket);

Paso siguiente: recibir y enviar datos en el servidor

Introducción a Winsock

Aplicación de servidor Winsock

Escucha en un socket