Windows Sockets: Usar la clase CAsyncSocket
En este artículo se explica cómo usar la clase CAsyncSocket
. Esta clase encapsula la API de Windows Sockets en un nivel muy bajo. CAsyncSocket
se destina al uso de los programadores que conozcan las comunicaciones de red en detalle, pero que quieran la comodidad de las devoluciones de llamada para la notificación de eventos de red. Con base en esta suposición, en este artículo solo se proporcionan instrucciones básicas. Probablemente debería considerar el uso de CAsyncSocket
si desea que la facilidad con que Windows Sockets funciona con varios protocolos de red en una aplicación MFC, pero no quiere sacrificar la flexibilidad. También podría sentir que puede obtener una mejor eficiencia si usted programa directamente las comunicaciones que al usar el modelo alternativo más general de la clase CSocket
.
CAsyncSocket
se documenta en la Referencia de MFC. Visual C++ también proporciona la especificación de Windows Sockets, que se encuentra en Windows SDK. Los detalles corren por su cuenta. Visual C++ no proporciona una aplicación de ejemplo para CAsyncSocket
.
Si no tiene conocimientos amplios sobre las comunicaciones de red y desea una solución sencilla, use la clase CSocket
con un objeto CArchive
. Consulte Windows Sockets: Uso de sockets con archivos para más información.
En este artículo se describe:
La creación y el uso de un objeto
CAsyncSocket
.
Creación y uso de una CAsyncSocket
Para usar CAsyncSocket
Construya un objeto
CAsyncSocket
y use el objeto para crear el manipuladorSOCKET
subyacente.La creación de un socket sigue el patrón de MFC de construcción en dos fases.
Por ejemplo:
CAsyncSocket sock; sock.Create(); // Use the default parameters
o bien
CAsyncSocket *pSocket = new CAsyncSocket; int nPort = 27; pSocket->Create(nPort, SOCK_DGRAM);
El primer constructor anterior crea un objeto
CAsyncSocket
en la pila. El segundo constructor crea unCAsyncSocket
en el montón. La primera llamada aCreate
anterior usa los parámetros predeterminados para crear un socket de flujo. La segunda llamada aCreate
crea un socket de datagrama con un puerto y una dirección especificados. (Puede usar cualquiera de las versiones deCreate
con cualquier método de construcción.)Los parámetros para
Create
son:Un "puerto": un entero corto.
Para un socket de servidor, debe especificar un puerto. Para un socket de cliente, normalmente acepta el valor predeterminado de este parámetro, lo que permite a Windows Sockets seleccionar un puerto.
Un tipo de socket:
SOCK_STREAM
(valor predeterminado) oSOCK_DGRAM
.Un socket de "dirección" como
"ftp.microsoft.com"
o"128.56.22.8"
.Esta es su dirección de protocolo de Internet (IP) en la red. Probablemente siempre se basará en el valor predeterminado de este parámetro.
Los términos "puerto" y "dirección de socket" se explican en Windows Sockets: Puertos y direcciones de socket.
Si el socket es un cliente, conecte el objeto de socket a un socket de servidor mediante
CAsyncSocket::Connect
.o bien
Si el socket es un servidor, establezca el socket para empezar a escuchar (con
CAsyncSocket::Listen
) en los intentos de conexión desde un cliente. Tras recibir una solicitud de conexión, acéptela conCAsyncSocket::Accept
.Después de aceptar una conexión, puede realizar tareas como validar contraseñas.
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. Para obtener un ejemplo, consulte el artículo Windows Sockets: Secuencia de operaciones.Lleve a cabo comunicaciones con otros sockets al llamar a las funciones miembro del objeto
CAsyncSocket
que encapsulan las funciones de la API de Windows Sockets.Consulte la especificación de Windows Sockets y la clase
CAsyncSocket
en la Referencia de MFC.Destruya el objeto
CAsyncSocket
.Si creó el objeto de socket en la pila, se llama a su destructor cuando la función contenedora sale del ámbito. Si ha creado el objeto de socket en el montón, con el operador
new
, es responsable de usar el operadordelete
para destruir el objeto.El destructor llama a la función miembro del objeto
Close
antes de destruir el objeto.
Para obtener un ejemplo de esta secuencia en el código (en realidad para un objeto CSocket
), consulte Windows Sockets: Secuencia de operaciones.
Sus responsabilidades con CAsyncSocket
Cuando se crea un objeto de clase CAsyncSocket
, el objeto encapsula un manipulador de Windows SOCKET
y proporciona operaciones en ese identificador. Al usar CAsyncSocket
, debe lidiar con todos los problemas que podrían surgir si usa la API directamente. Por ejemplo:
Escenarios de "bloqueo".
Diferencias de orden de bytes entre las máquinas de envío y recepción.
Conversión entre cadenas de juego de caracteres multibyte (MBCS) y Unicode.
Para obtener definiciones de estos términos e información adicional, consulte Windows Sockets: bloqueo, Windows Sockets: orden de bytes, Windows Sockets: conversión de cadenas.
A pesar de estos problemas, la clase CAsyncSocket
puede ser la opción adecuada para usted si su aplicación requiere toda la flexibilidad y el control que pueda obtener. Si no es así, considere la posibilidad de usar la clase CSocket
en su lugar. CSocket
le oculta muchos detalles: bombea mensajes de Windows durante las llamadas de bloqueo y le da acceso a CArchive
, que administra las diferencias de orden de bytes y la conversión de cadenas por usted.
Para más información, consulte:
- Windows Sockets: Nociones\
- Windows Sockets: Sockets de flujos\
- Windows Sockets: Sockets de datagramas