Windows Sockets: Usar la clase CAsyncSocket

En este artículo se explica cómo usar la clase CAsyncSocket. Esta clase encapsula la API de Windows Sockets en un nivel muy bajo. CAsyncSocket se destina al uso de los programadores que conozcan las comunicaciones de red en detalle, pero que quieran la comodidad de las devoluciones de llamada para la notificación de eventos de red. Con base en esta suposición, en este artículo solo se proporcionan instrucciones básicas. Probablemente debería considerar el uso de CAsyncSocket si desea que la facilidad con que Windows Sockets funciona con varios protocolos de red en una aplicación MFC, pero no quiere sacrificar la flexibilidad. También podría sentir que puede obtener una mejor eficiencia si usted programa directamente las comunicaciones que al usar el modelo alternativo más general de la clase CSocket.

CAsyncSocket se documenta en la Referencia de MFC. Visual C++ también proporciona la especificación de Windows Sockets, que se encuentra en Windows SDK. Los detalles corren por su cuenta. Visual C++ no proporciona una aplicación de ejemplo para CAsyncSocket.

Si no tiene conocimientos amplios sobre las comunicaciones de red y desea una solución sencilla, use la clase CSocket con un objeto CArchive. Consulte Windows Sockets: Uso de sockets con archivos para más información.

En este artículo se describe:

Creación y uso de una CAsyncSocket

Para usar CAsyncSocket

  1. Construya un objeto CAsyncSocket y use el objeto para crear el manipulador SOCKET subyacente.

    La creación de un socket sigue el patrón de MFC de construcción en dos fases.

    Por ejemplo:

    CAsyncSocket sock;
    sock.Create(); // Use the default parameters
    

    o bien

    CAsyncSocket *pSocket = new CAsyncSocket;
    int nPort = 27;
    pSocket->Create(nPort, SOCK_DGRAM);
    

    El primer constructor anterior crea un objeto CAsyncSocket en la pila. El segundo constructor crea un CAsyncSocket en el montón. La primera llamada a Create anterior usa los parámetros predeterminados para crear un socket de flujo. La segunda llamada a Create crea un socket de datagrama con un puerto y una dirección especificados. (Puede usar cualquiera de las versiones de Create con cualquier método de construcción.)

    Los parámetros para Create son:

    • Un "puerto": un entero corto.

      Para un socket de servidor, debe especificar un puerto. Para un socket de cliente, normalmente acepta el valor predeterminado de este parámetro, lo que permite a Windows Sockets seleccionar un puerto.

    • Un tipo de socket: SOCK_STREAM (valor predeterminado) o SOCK_DGRAM.

    • Un socket de "dirección" como "ftp.microsoft.com" o "128.56.22.8".

      Esta es su dirección de protocolo de Internet (IP) en la red. Probablemente siempre se basará en el valor predeterminado de este parámetro.

    Los términos "puerto" y "dirección de socket" se explican en Windows Sockets: Puertos y direcciones de socket.

  2. Si el socket es un cliente, conecte el objeto de socket a un socket de servidor mediante CAsyncSocket::Connect.

    o bien

    Si el socket es un servidor, establezca el socket para empezar a escuchar (con CAsyncSocket::Listen) en los intentos de conexión desde un cliente. Tras recibir una solicitud de conexión, acéptela con CAsyncSocket::Accept.

    Después de aceptar una conexión, puede realizar tareas como validar contraseñas.

    Nota:

    La función miembro Accept toma una referencia a un objeto CSocket nuevo y vacío como parámetro. Debe construir este objeto antes de llamar a Accept. Si este objeto de socket sale del ámbito, la conexión se cierra. No llame a Create para este nuevo objeto de socket. Para obtener un ejemplo, consulte el artículo Windows Sockets: Secuencia de operaciones.

  3. Lleve a cabo comunicaciones con otros sockets al llamar a las funciones miembro del objeto CAsyncSocket que encapsulan las funciones de la API de Windows Sockets.

    Consulte la especificación de Windows Sockets y la clase CAsyncSocket en la Referencia de MFC.

  4. Destruya el objeto CAsyncSocket.

    Si creó el objeto de socket en la pila, se llama a su destructor cuando la función contenedora sale del ámbito. Si ha creado el objeto de socket en el montón, con el operador new, es responsable de usar el operador delete para destruir el objeto.

    El destructor llama a la función miembro del objeto Close antes de destruir el objeto.

Para obtener un ejemplo de esta secuencia en el código (en realidad para un objeto CSocket), consulte Windows Sockets: Secuencia de operaciones.

Sus responsabilidades con CAsyncSocket

Cuando se crea un objeto de clase CAsyncSocket, el objeto encapsula un manipulador de Windows SOCKET y proporciona operaciones en ese identificador. Al usar CAsyncSocket, debe lidiar con todos los problemas que podrían surgir si usa la API directamente. Por ejemplo:

  • Escenarios de "bloqueo".

  • Diferencias de orden de bytes entre las máquinas de envío y recepción.

  • Conversión entre cadenas de juego de caracteres multibyte (MBCS) y Unicode.

Para obtener definiciones de estos términos e información adicional, consulte Windows Sockets: bloqueo, Windows Sockets: orden de bytes, Windows Sockets: conversión de cadenas.

A pesar de estos problemas, la clase CAsyncSocket puede ser la opción adecuada para usted si su aplicación requiere toda la flexibilidad y el control que pueda obtener. Si no es así, considere la posibilidad de usar la clase CSocket en su lugar. CSocket le oculta muchos detalles: bombea mensajes de Windows durante las llamadas de bloqueo y le da acceso a CArchive, que administra las diferencias de orden de bytes y la conversión de cadenas por usted.

Para más información, consulte:

Consulte también

Windows Sockets en MFC