Red de conocimiento informático - Conocimiento del nombre de dominio - Para desarrollar programas de red, ¿debería utilizar la API de Winsock o la clase Socket proporcionada por MFC?

Para desarrollar programas de red, ¿debería utilizar la API de Winsock o la clase Socket proporcionada por MFC?

Comparación de dos clases de sockets VC

1. Método de implementación

El MFC de Microsoft encapsula funciones complejas de la API de WinSock en clases, lo que facilita la escritura de aplicaciones de red. El procedimiento es más fácil. 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. Esta clase se basa en el supuesto de que el programador comprende la comunicación de red. Para utilizar WinSock en MFC, el programador es responsable 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 se hereda de la clase CAsyncSocket y proporciona una interfaz API WinSock de nivel superior que CAsyncSocket. Las clases Csocket y CsocketFile pueden funcionar junto 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 crucial 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 necesita comodidad, puede usar la clase Csocket.

La clase CSocket se hereda de CAsyncSocket. De hecho, en MFC, CAsyncSocket encapsula la API de WinSock una por una. Cada objeto CAsyncSocket representa un objeto Windows Socket. El uso de la clase CAsyncSocket requiere que los programadores estén más familiarizados con ella. programación de red. En comparación, la clase CSocket es una clase derivada de CAsyncSocket y hereda la API de WinSock que encapsula.

Un objeto CSocket representa una abstracción de Windows Socket de nivel superior que el objeto CAsyncSocket. La clase CSocket funciona con la clase CSocketFile y la clase CArchive para enviar y recibir datos, por lo que es más fácil de usar. El objeto CSocket proporciona el modo de bloqueo, porque la función de bloqueo es crucial para la operación de sincronización de CArchive. Es necesario explicar el concepto de bloqueo aquí: un socket puede estar en "modo de bloqueo" o "modo sin bloqueo". Cuando un socket está en modo de bloqueo (es decir, operación sincrónica), su función de bloqueo no se ejecutará hasta que se ejecute. la operación se completa y se devuelve el control. Se llama bloqueo porque la función de bloqueo en este socket no puede hacer nada hasta que completa la operación y regresa. Si un socket está en modo sin bloqueo (es decir, operación asincrónica), la función llamada regresará inmediatamente. En la clase CAsyncSocket, puede usar la función miembro GetLastError para consultar el último error. Si el error es WSAEWOULDBLOCK, significa que hay bloqueo y CSocket nunca devolverá WSAEWOULDBLOCK porque administra el bloqueo por sí mismo. Microsoft recomienda utilizar el modo sin bloqueo tanto como sea posible para notificar a la aplicación que maneje el procesamiento correspondiente cuando ocurren eventos de red. 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 son de naturaleza bloqueante. Esto se debe a que la clase CArchive requiere operaciones sincrónicas.

En el entorno Win32, si desea utilizar un socket de bloqueo, debe procesarse en un subproceso de trabajo independiente y debe usarse el método de subprocesos múltiples para evitar que el bloqueo interfiera con otros subprocesos y No interrumpir otros subprocesos es una pérdida de tiempo de CPU bloqueando. El enfoque de subprocesos múltiples permite a los programadores disfrutar de la comodidad 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. Su eficiencia es mayor que. Clase CSocket. El modelo de programación de la clase CAsyncSocket para sockets 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 formas siguientes:

CAsyncSocket sock; //Utilice parámetros predeterminados para generar un socket de flujo de bytes

Sock.Create(); > O generar un socket de datagrama en el número de puerto especificado

CAsyncSocket*pSocket=newCAsyncSocket;

int nPort=27;

pSocket->Create( nPort, SOCK-DGRAM);

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, se utiliza la función miembro Create() Omitir parámetros; para generar un socket de flujo de bytes. En el segundo método, use la función miembro Create() para generar un socket digital en el puerto especificado. El prototipo de la función Create() es:

BOOL Create( UINT nSocketPort = 0, int nSocketType = SOCK_STREAM,

LPCTSTR lpszSocketA