Nivel de programación de red
1. Método de implementación
Microsoft MFC encapsula funciones complejas de la API de WinSock en clases, lo que facilita la escritura de aplicaciones de red. La clase CAsyncSocket encapsula la API de WinSock una por una, proporcionando un método más potente y flexible para programadores de redes avanzados. Este curso se basa en el supuesto de que los programadores comprenden la comunicación de red, con el objetivo de utilizar WinSock en MFC. Los programadores son responsables de manejar tareas como el bloqueo, el orden de bytes y la conversión de caracteres entre Unicode y MBCS. Para proporcionar a los programadores una interfaz más conveniente para manejar automáticamente estas tareas, MFC proporciona la clase CSocket, que hereda la clase CAsyncSocket y proporciona una interfaz API WinSock más avanzada que CAsyncSocket. Las clases Csocket y CsocketFile pueden cooperar con la clase Carchive para administrar los datos enviados y recibidos, lo que hace que sea más conveniente administrar el envío y la recepción de datos. El objeto CSocket proporciona un modo de bloqueo, que es muy importante para las operaciones de sincronización de Carchive. Las funciones de bloqueo (como Recibir(), Enviar(), RecibirDe(), EnviarA() y Aceptar()) no devuelven el control hasta que se completa la operación, por lo que si necesita control de bajo nivel y alta eficiencia, use CasyncSock class; si es conveniente, puede utilizar la clase Csocket.
La clase CSocket hereda de CAsyncSocket. De hecho, CAsyncSocket encapsula la API de WinSock una por una en MFC, y cada objeto CAsyncSocket representa un objeto de Windows Socket. El uso de la clase CAsyncSocket requiere que los programadores estén familiarizados con la programación de redes. Por el contrario, la clase CSocket es una clase derivada de CAsyncSocket y hereda la API de WinSock que encapsula.
Los objetos CSocket representan un nivel más alto de abstracción de sockets de Windows que los objetos CAsyncSocket. La clase CSocket trabaja junto con la clase CSocketFile y la clase CArchive para enviar y recibir datos, lo que facilita su uso. El objeto CSocket proporciona un modo de bloqueo, porque la función de bloqueo es muy importante para la operación de sincronización de CArchive. Es necesario explicar aquí el concepto de bloqueo: un socket puede estar en "modo de bloqueo" o "modo sin bloqueo". Cuando un socket está en modo de bloqueo (es decir, una operación sincrónica), su función de bloqueo no devuelve el control hasta que se completa la operación. Se llama bloqueo porque la función de bloqueo del socket no puede hacer nada hasta que regrese la operación. Si el socket está en modo sin bloqueo (es decir, una operación asincrónica), la función llamada regresará inmediatamente. En la clase CAsyncSocket, puede utilizar la función miembro GetLastError para consultar el último error. Si el error es WSAEWOULDBLOCK, entonces hay un bloque, CSocket nunca devuelve WSAEWOULDBLOCK porque administra los bloques él mismo. Microsoft recomienda utilizar el modo sin bloqueo tanto como sea posible y notificar a las aplicaciones sobre los eventos de red para manejarlos en consecuencia. Sin embargo, en la clase CSocket, para utilizar CArchive para manejar muchos problemas de comunicación y simplificar la programación, algunas de sus funciones miembro siempre están bloqueadas porque la clase CArchive requiere operaciones sincrónicas.
En un entorno Win32, si desea utilizar un socket con propiedades de bloqueo, debe manejarlo en un subproceso de trabajo independiente. Al utilizar un enfoque de subprocesos múltiples, el bloqueo no interferirá con otros subprocesos y no se desperdiciará tiempo de CPU en el bloqueo. El método de subprocesos múltiples permite a los programadores disfrutar de la conveniencia de la programación simplificada que ofrece CSocket sin afectar la respuesta de la interfaz de usuario a los usuarios.
Modelo de programación de clase CAsyncSocket
En una aplicación MFC, si desea manejar fácilmente múltiples protocolos de red sin sacrificar la flexibilidad, puede considerar usar la clase CAsyncSocket, que es mejor que cSocket. La clase es más eficiente.
El modelo de programación de la clase CAsyncSocket del socket de flujo de bytes se describe brevemente a continuación:
1. Construya un objeto CAsyncSocket y use la función miembro Crear de este objeto para generar un identificador de socket. Se puede construir de las dos maneras siguientes:
CAsyncSocket Socks; //Generar un socket de flujo de bytes con parámetros predeterminados.
Calcetines. create();
O generar un socket de datagrama en el número de puerto especificado.
CAsyncSocket * p socket = newCAsyncSocket;
int nPort = 27
p socket-& gt; >
El primer método genera un objeto CAsyncSocket en la pila, mientras que el segundo método genera un objeto CAsyncSocket en el montón. En el primer método, la función miembro Create() genera un socket de flujo de bytes utilizando parámetros predeterminados. En el segundo método, la función miembro Create() genera un socket de datagrama en el puerto especificado. El prototipo de la función Create() es:
BOOL Create( UINT nSocketPort = 0, int nSocketType = SOCK_STREAM,
LPCTSTR lpszSocketA