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
Construya un objeto CSocket.
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 servidorCSocket
, debe especificar un puerto en la llamada aCreate
.Nota:
CArchive
no funciona con sockets de datagrama. Si quiere usarCSocket
para un socket de datagrama, debe usar la clase del mismo modo que usaríaCAsyncSocket
, 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 usarCSocket
con un objetoCArchive
para un datagrama, se produce un error en una aserción de MFC.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 objetoCSocket
nuevo y vacío como parámetro. Debe construir este objeto antes de llamar aAccept
. Si este objeto de socket sale del ámbito, la conexión se cierra. No llame aCreate
para este nuevo objeto de socket.Cree un objeto CSocketFile y asócielo al objeto
CSocket
.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.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 objetosCArchive
: 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.
Destruya el archivo, el archivo de socket y los objetos de socket.
Nota:
La clase
CArchive
proporciona la función miembroIsBufferEmpty
de forma específica para su uso con la claseCSocket
. 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. UseIsBufferEmpty
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: