Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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 CAsyncSocket
programació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
Construye un objeto CSocket .
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 unCSocket
objeto de servidor, debe especificar un puerto en laCreate
llamada.Nota:
CArchive
no funciona con sockets de datagrama. Si desea usarCSocket
para un socket de datagrama, debe usar la clase como usaríaCAsyncSocket
, 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 usarCSocket
con unCArchive
objeto 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-
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íoCSocket
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 , asociando el
CSocket
objeto con él.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.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á dosCArchive
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.
Destruye el archivo, el archivo de socket y los objetos de socket.
Nota:
La clase
CArchive
proporciona laIsBufferEmpty
función miembro específicamente 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 siguiente notificación 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 obtener más información, consulte: