Windows Sockets: Usar sockets con archivos

En este artículo se describe el modelo de programación de CSocket. La clase CSocket proporciona compatibilidad con sockets en un nivel superior de abstracción que la que ofrece la clase CAsyncSocket. CSocket usa una versión del protocolo de serialización de MFC para pasar datos a un objeto de socket, y desde este, mediante un objeto CArchive de MFC. CSocket proporciona bloqueo (al administrar el procesamiento en segundo plano de los mensajes de Windows) y proporciona acceso a CArchive, que administra muchos aspectos de la comunicación que tendría que hacer por su cuenta mediante la API sin procesar o la clase CAsyncSocket.

Sugerencia

Puede usar la clase CSocket por sí misma, como una versión más cómoda de CAsyncSocket, pero el modelo de programación más sencillo es usar CSocket con un objeto CArchive.

Para obtener más información sobre cómo funciona la implementación de sockets con archivos, vea Windows Sockets: Cómo funcionan los sockets con archivos. Para obtener código de ejemplo, vea Windows Sockets: Secuencia de operaciones y Windows Sockets: Ejemplo de sockets que usan archivos. Para obtener información sobre parte de la función que puede obtener derivando sus propias clases de las clases de sockets, vea Windows Sockets: Derivar de las clases de socket.

Nota:

Si está escribiendo un programa cliente de MFC para comunicarse con servidores establecidos (que no sean MFC), no envíe objetos de C++ mediante el archivo. A menos que el servidor sea una aplicación MFC que comprenda los tipos de objetos que quiere enviar, no podrá recibir ni deserializar los objetos. Para obtener material relacionado sobre el tema de la comunicación con aplicaciones que no son MFC, vea también el artículo Windows Sockets: Orden de bytes.

El modelo de programación de CSocket

El uso de un objeto CSocket implica crear y asociar varios objetos de clase MFC. En el procedimiento general siguiente, el socket de servidor y el socket de cliente realizan cada paso, excepto en el paso 3, en el que cada tipo de socket requiere una acción distinta.

Sugerencia

En tiempo de ejecución, la aplicación de servidor normalmente comienza a estar lista y "escuchando" cuando la aplicación cliente busca una conexión. Si el servidor no está listo cuando el cliente intenta conectarse, normalmente es necesario que la aplicación de usuario intente conectarse de nuevo más tarde.

Configuración de la comunicación entre un socket de servidor y un socket de cliente

  1. Construya un objeto CSocket.

  2. Use el objeto para crear el identificador SOCKET subyacente.

    Para un objeto de cliente CSocket, normalmente debe usar los parámetros predeterminados para crear, a menos que necesite un socket de datagrama. Para un objeto de servidor CSocket, debe especificar un puerto en la llamada a Create.

    Nota:

    CArchive no funciona con sockets de datagrama. Si quiere usar CSocket para un socket de datagrama, debe usar la clase del mismo modo que usaría CAsyncSocket, es decir, sin un archivo. Dado que los datagramas no son fiables (no se garantiza que lleguen y se pueden repetir o estar fuera de la secuencia), no son compatibles con la serialización mediante un archivo. Se espera que una operación de serialización se complete de forma fiable y secuencial. Si intenta usar CSocket con un objeto CArchive para un datagrama, se produce un error en una aserción de MFC.

  3. Si el socket es un cliente, llame a CAsyncSocket::Connect para conectar el objeto de socket a un socket de servidor.

    o bien

    Si el socket es un servidor, llame a CAsyncSocket::Listen para comenzar a escuchar los intentos de conexión procedentes de un cliente. Tras recibir una solicitud de conexión, acéptela llamando a CAsyncSocket::Accept.

    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.

  4. Cree un objeto CSocketFile y asócielo al objeto CSocket.

  5. Cree un objeto CArchive para cargar (recibir) o almacenar (enviar) datos. El archivo está asociado al objeto CSocketFile.

    Tenga en cuenta que CArchive no funciona con sockets de datagrama.

  6. Use el objeto CArchive para pasar datos entre los sockets de cliente y servidor.

    Tenga en cuenta que un objeto CArchive determinado mueve los datos solo en una dirección: para cargar (recibir) o almacenar (enviar). En algunos casos, usará dos objetos CArchive: uno para enviar datos y el otro para recibir confirmaciones.

    Después de aceptar una conexión y configurar el archivo, puede realizar tareas como, por ejemplo, validar contraseñas.

  7. Destruya el archivo, el archivo de socket y los objetos de socket.

    Nota:

    La clase CArchive proporciona la función miembro IsBufferEmpty de forma específica para su uso con la clase CSocket. Si el búfer contiene varios mensajes de datos, por ejemplo, debe recorrer en bucle hasta que se lean todos ellos y se borre el búfer. De lo contrario, la notificación siguiente de que hay datos que se van a recibir puede retrasarse indefinidamente. Use IsBufferEmpty para asegurarse de que recupera todos los datos.

En el artículo Windows Sockets: Secuencia de operaciones se muestran ambos lados de este proceso con código de ejemplo.

Para más información, consulte:

Consulte también

Windows Sockets en MFC
CSocket::Create