Compartir a través de


Windows Sockets: Uso de 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 clase CAsyncSocket. CSocket usa una versión del protocolo de serialización de MFC para pasar datos hacia y desde un objeto de socket a través de 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 usted mismo 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 , pero el modelo de CAsyncSocketprogramación más sencillo es usar CSocket con un CArchive objeto .

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 mediante archivos. Para obtener información sobre algunas de las funciones que puede obtener derivando sus propias clases de las clases de sockets, consulte Windows Sockets: Derivación de clases de socket.

Nota:

Si va a escribir un programa cliente MFC para comunicarse con servidores establecidos (no MFC), no envíe objetos de C++ a través del archivo. A menos que el servidor sea una aplicación MFC que comprenda los tipos de objetos que desea 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, consulte también el artículo Windows Sockets: Byte Ordering.

El modelo de programación de CSocket

El uso de un CSocket objeto 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 diferente.

Sugerencia

En tiempo de ejecución, la aplicación de servidor normalmente se inicia primero para 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 requiere que la aplicación de usuario intente conectarse de nuevo más adelante.

Para configurar la comunicación entre un socket de servidor y un socket de cliente

  1. Construye un objeto CSocket .

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

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

    Nota:

    CArchive no funciona con sockets de datagrama. Si desea usar CSocket para un socket de datagrama, debe usar la clase como usaría CAsyncSocket, es decir, sin un archivo. Dado que los datagramas no son confiables (no se garantiza que lleguen y se puedan repetir o salir de la secuencia), no son compatibles con la serialización a través de un archivo. Se espera que una operación de serialización se complete de forma confiable y en secuencia. Si intenta usar CSocket con un CArchive objeto 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-

    Si el socket es un servidor, llame a CAsyncSocket::Listen para empezar a escuchar los intentos de conexión desde un cliente. Después de recibir una solicitud de conexión, aceptela llamando a CAsyncSocket::Accept.

    Nota:

    La Accept función miembro toma una referencia a un nuevo objeto vacío CSocket 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 , asociando el CSocket objeto con él.

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

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

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

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

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

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

    Nota:

    La clase CArchive proporciona la IsBufferEmpty función miembro específicamente 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 siguiente notificación 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 obtener más información, consulte:

Consulte también

Windows Sockets en MFC
CSocket::Create