Clase CAsyncSocket

Representa una instancia de Windows Sockets (esto es, un punto de conexión de comunicación por red).

Sintaxis

class CAsyncSocket : public CObject

Miembros

Constructores públicos

Nombre Descripción
CAsyncSocket::CAsyncSocket Construye un objeto CAsyncSocket.

Métodos públicos

Nombre Descripción
CAsyncSocket::Accept Acepta una conexión en el socket.
CAsyncSocket::AsyncSelect Solicita una notificación de eventos para el socket.
CAsyncSocket::Attach Asocia un identificador de socket a un objeto CAsyncSocket.
CAsyncSocket::Bind Asocia una dirección local al socket.
CAsyncSocket::Close Cierra el socket.
CAsyncSocket::Connect Establece una conexión a un socket del mismo nivel.
CAsyncSocket::Create Crea un socket.
CAsyncSocket::CreateEx Crea un socket con opciones avanzadas.
CAsyncSocket::Detach Desasocia un identificador de socket de un objeto CAsyncSocket.
CAsyncSocket::FromHandle Devuelve un puntero a un objeto CAsyncSocket, dado un identificador de socket.
CAsyncSocket::GetLastError Obtiene el estado de error de la última operación que produjo un error.
CAsyncSocket::GetPeerName Obtiene la dirección del socket del mismo nivel al que está conectado el socket.
CAsyncSocket::GetPeerNameEx Obtiene la dirección del socket del mismo nivel al que está conectado el socket (controla las direcciones IPv6).
CAsyncSocket::GetSockName Obtiene el nombre local de un socket.
CAsyncSocket::GetSockNameEx Obtiene el nombre local de un socket (controla las direcciones IPv6).
CAsyncSocket::GetSockOpt Recupera una opción de socket.
CAsyncSocket::IOCtl Controla el modo del socket.
CAsyncSocket::Listen Establece un socket para escuchar las solicitudes de conexión entrantes.
CAsyncSocket::Receive Recibe datos del socket.
CAsyncSocket::ReceiveFrom Recibe un datagrama y almacena la dirección de origen.
CAsyncSocket::ReceiveFromEx Recibe un datagrama y almacena la dirección de origen (controla las direcciones IPv6).
CAsyncSocket::Send Envía datos a un socket conectado.
CAsyncSocket::SendTo Envía datos a un destino específico.
CAsyncSocket::SendToEx Envía datos a un destino específico (controla las direcciones IPv6).
CAsyncSocket::SetSockOpt Establece una opción de socket.
CAsyncSocket::ShutDown Impide Send y/o Receive llamadas en el socket.
CASyncSocket::Socket Asigna un identificador de socket.

Métodos protegidos

Nombre Descripción
CAsyncSocket::OnAccept Notifica a un socket de escucha que puede aceptar solicitudes de conexión pendientes mediante una llamada a Accept.
CAsyncSocket::OnClose Notifica a un socket que el socket conectado a él se ha cerrado.
CAsyncSocket::OnConnect Notifica a un socket en proceso de conexión que el intento de conexión se ha completado, ya sea correctamente o con errores.
CAsyncSocket::OnOutOfBandData Notifica a un socket en proceso de recepción que hay datos fuera de banda que se van a leer en el socket (suele ser un mensaje urgente).
CAsyncSocket::OnReceive Notifica a un socket en proceso de escucha que hay datos que se van a recuperar mediante una llamada a Receive.
CAsyncSocket::OnSend Notifica a un socket que puede enviar datos mediante una llamada a Send.

Operadores públicos

Nombre Descripción
CAsyncSocket::operator = Asigna un nuevo valor a un objeto CAsyncSocket.
CAsyncSocket::operator SOCKET Use este operador para recuperar el identificador SOCKET del objeto CAsyncSocket.

Miembros de datos públicos

Nombre Descripción
CAsyncSocket::m_hSocket Indica el identificador SOCKET asociado a este objeto CAsyncSocket.

Comentarios

La clase CAsyncSocket encapsula la API de funciones de Windows Sockets, que proporciona una abstracción orientada a objetos a aquellos programadores que quieran usar Windows Sockets junto con MFC.

Esta clase se basa en la suposición de que quien la use sabe cómo funcionan las comunicaciones de red. El usuario es responsable de controlar los bloqueos, las diferencias en el orden de bytes y las conversiones entre cadenas de caracteres Unicode y del juego de caracteres multibyte (MBCS). Si prefiere usar una interfaz más cómoda que se encargue de estas cuestiones, vea la clase CSocket.

Para usar un objeto CAsyncSocket, llame a su constructor y, a continuación, llame a la función Create para crear el identificador de socket subyacente (de tipo SOCKET), excepto en los sockets aceptados. Si es un socket de servidor, llame a la función miembro Listen y si es un socket de cliente, llame a la función miembro Connect. El socket de servidor debe llamar a la función Accept al recibir una solicitud de conexión. Utilice las funciones CAsyncSocket restantes para establecer comunicaciones entre sockets. Cuando termine, destruya el objeto CAsyncSocket si se creó en el montón; el destructor llama automáticamente a la función Close. El tipo de datos SOCKET se describe en el artículo Windows Sockets: Información de contexto.

Nota:

Al usar sockets de MFC en subprocesos secundarios en una aplicación de MFC vinculada estáticamente, debe llamar a AfxSocketInit en cada subproceso que use sockets para inicializar las bibliotecas de sockets. De manera predeterminada, se llama a AfxSocketInit solo en el subproceso principal.

Para obtener más información, vea Windows Sockets: Uso de la clase CAsyncSocket y otros artículos relacionados, así como API de Windows Sockets 2.

Jerarquía de herencia

CObject

CAsyncSocket

Requisitos

Encabezadoafxsock.h:

CAsyncSocket::Accept

Llame a esta función miembro para aceptar una conexión en un socket.

virtual BOOL Accept(
    CAsyncSocket& rConnectedSocket,
    SOCKADDR* lpSockAddr = NULL,
    int* lpSockAddrLen = NULL);

Parámetros

rConnectedSocket
Referencia que identifica un nuevo socket que está disponible para la conexión.

lpSockAddr
Puntero a una estructura SOCKADDR que recibe la dirección del socket de conexión, como se conoce en la red. El formato exacto del argumento lpSockAddr viene determinado por la familia de direcciones establecida cuando se creó el socket. Si lpSockAddr y/o lpSockAddrLen son iguales a NULL, no se devuelve información sobre la dirección remota del socket aceptado.

lpSockAddrLen
Puntero a la longitud de la dirección en lpSockAddr, en bytes. lpSockAddrLen es un parámetro de tipo valor-resultado: debe contener inicialmente la cantidad de espacio señalada por lpSockAddr; al regresar, contendrá la longitud real (en bytes) de la dirección devuelta.

Valor devuelto

Distinto de cero si la función es correcta; de lo contrario, 0. Además, se puede recuperar un código de error específico mediante una llamada a GetLastError. Los siguientes errores se aplican a esta función miembro:

  • WSANOTINITIALISEDAfxSocketInit debe producirse correctamente para poder usar esta API.

  • WSAENETDOWN La implementación de Windows Sockets ha detectado que se ha producido un error en el subsistema de red.

  • WSAEFAULT El argumento lpSockAddrLen es demasiado pequeño (inferior al tamaño de una estructura SOCKADDR).

  • WSAEINPROGRESS Hay una llamada de Windows Sockets de bloqueo en curso.

  • WSAEINVALListen no se invocó antes de aceptar.

  • WSAEMFILE La cola está vacía al entrar para aceptar y no hay descriptores disponibles.

  • WSAENOBUFS No hay espacio disponible en el búfer.

  • WSAENOTSOCK El descriptor no es un socket.

  • WSAEOPNOTSUPP El socket al que se hace referencia no es un tipo que admite el servicio orientado a la conexión.

  • WSAEWOULDBLOCK El socket está marcado como de no bloqueo y no hay conexiones presentes que aceptar.

Comentarios

Esta rutina extrae la primera conexión de la cola de conexiones pendientes, crea un socket nuevo con las mismas propiedades que este socket y lo asocia a rConnectedSocket. Si no hay ninguna conexión pendiente en la cola, Accept devuelve cero y GetLastError devuelve un error. El socket aceptado (rConnectedSocket) no se puede usar para aceptar más conexiones. El socket original permanece abierto y a la escucha.

El argumento lpSockAddr es un parámetro de resultado que se rellena con la dirección del socket de conexión, como se conoce en la capa de comunicaciones. Accept se usa con tipos de socket basados en la conexión, como SOCK_STREAM.

CAsyncSocket::AsyncSelect

Llame a esta función miembro para solicitar una notificación de eventos para un socket.

BOOL AsyncSelect(long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE);

Parámetros

lEvent
Máscara de bits que especifica una combinación de eventos de red en los que la aplicación está interesada.

  • FD_READ Se quiere recibir una notificación de preparación de lectura.

  • FD_WRITE Se quiere recibir una notificación cuando haya datos disponibles para leerse.

  • FD_OOB Se quiere recibir una notificación cuando lleguen datos fuera de banda.

  • FD_ACCEPT Se quiere recibir una notificación de las conexiones entrantes.

  • FD_CONNECT Se quiere recibir una notificación de los resultados de la conexión.

  • FD_CLOSE Se quiere recibir una notificación cuando un socket del mismo nivel cierre un socket.

Valor devuelto

Distinto de cero si la función es correcta; de lo contrario, 0. Además, se puede recuperar un código de error específico mediante una llamada a GetLastError. Los siguientes errores se aplican a esta función miembro:

  • WSANOTINITIALISEDAfxSocketInit debe producirse correctamente para poder usar esta API.

  • WSAENETDOWN La implementación de Windows Sockets ha detectado que se ha producido un error en el subsistema de red.

  • WSAEINVAL Indica que uno de los parámetros especificados no era válido.

  • WSAEINPROGRESS Hay una operación de Windows Sockets de bloqueo en curso.

Comentarios

Esta función se usa para especificar qué funciones de notificación de devolución de llamada de MFC se llamarán en relación con el socket. AsyncSelect establece automáticamente este socket en modo de no bloqueo. Para obtener más información, vea el artículo Windows Sockets: Notificaciones de socket.

CAsyncSocket::Attach

Llame a esta función miembro para asociar el identificador hSocket a un objeto CAsyncSocket.

BOOL Attach(
    SOCKET hSocket, long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE);

Parámetros

hSocket
Contiene un identificador a un socket.

lEvent
Máscara de bits que especifica una combinación de eventos de red en los que la aplicación está interesada.

  • FD_READ Se quiere recibir una notificación de preparación de lectura.

  • FD_WRITE Se quiere recibir una notificación cuando haya datos disponibles para leerse.

  • FD_OOB Se quiere recibir una notificación cuando lleguen datos fuera de banda.

  • FD_ACCEPT Se quiere recibir una notificación de las conexiones entrantes.

  • FD_CONNECT Se quiere recibir una notificación de los resultados de la conexión.

  • FD_CLOSE Se quiere recibir una notificación cuando un socket del mismo nivel cierre un socket.

Valor devuelto

Es distinto de cero si la función se realiza correctamente.

Comentarios

El identificador SOCKET se almacena en el miembro de datos m_hSocket del objeto.

CAsyncSocket::Bind

Llame a esta función miembro para asociar una dirección local con el socket.

BOOL Bind(
    UINT nSocketPort,
    LPCTSTR lpszSocketAddress = NULL);

BOOL Bind (
    const SOCKADDR* lpSockAddr,
    int nSockAddrLen);

Parámetros

nSocketPort
Puerto que identifica la aplicación de socket.

lpszSocketAddress
Dirección de red, compuesta de números separados por puntos, como "128.56.22.8". Pasar la cadena NULL para este parámetro indica que la instancia CAsyncSocket debe escuchar la actividad del cliente en todas las interfaces de red.

lpSockAddr
Puntero a una estructura SOCKADDR que contiene la dirección que se va a asignar a este socket.

nSockAddrLen
Longitud de la dirección en lpSockAddr, en bytes.

Valor devuelto

Distinto de cero si la función es correcta; de lo contrario, 0. Además, se puede recuperar un código de error específico mediante una llamada a GetLastError. En la siguiente lista se describen algunos de los errores que se pueden devolver. Para obtener la lista completa, vea Códigos de error de Windows Sockets.

  • WSANOTINITIALISEDAfxSocketInit debe producirse correctamente para poder usar esta API.

  • WSAENETDOWN La implementación de Windows Sockets ha detectado que se ha producido un error en el subsistema de red.

  • WSAEADDRINUSE La dirección especificada ya está en uso (vea la opción de socket SO_REUSEADDR en SetSockOpt).

  • WSAEFAULT El argumento nSockAddrLen es demasiado pequeño (inferior al tamaño de una estructura SOCKADDR).

  • WSAEINPROGRESS Hay una llamada de Windows Sockets de bloqueo en curso.

  • WSAEAFNOSUPPORT Este puerto no admite la familia de direcciones especificada.

  • WSAEINVAL El socket ya está enlazado a una dirección.

  • WSAENOBUFS No hay suficientes búferes disponibles; demasiadas conexiones.

  • WSAENOTSOCK El descriptor no es un socket.

Comentarios

Esta rutina se usa en un socket de secuencias o de datagrama no conectado, antes de llamadas posteriores a Connect o a Listen. Para poder aceptar solicitudes de conexión, un socket de servidor de escucha debe seleccionar un número de puerto y comunicarlo a Windows Sockets mediante una llamada a Bind. Bind establece la asociación local (dirección de host/número de puerto) del socket, asignando para ello un nombre local a un socket sin nombre.

CAsyncSocket::CAsyncSocket

Construye un objeto de socket en blanco.

CAsyncSocket();

Comentarios

Después de construir el objeto, debe llamar a su función miembro Create para crear la estructura de datos SOCKET y enlazar su dirección (en el lado servidor de una comunicación de Windows Sockets, cuando el socket de escucha crea el socket que se va a usar en la llamada a Accept, no se llama a Create en relación con ese socket).

CAsyncSocket::Close

Cierra el socket.

virtual void Close();

Comentarios

Esta función libera el descriptor de socket, de forma que cualquier referencia posterior a ella produce el error WSAENOTSOCK. Si se trata de la última referencia al socket subyacente, la información de nomenclatura asociada y los datos en cola se descartan. El destructor del objeto de socket llama a Close de forma automática.

En CAsyncSocket (pero no así en CSocket), la semántica de Close se ve afectada por las opciones de socket SO_LINGER y SO_DONTLINGER. Para obtener más información, vea la función miembro GetSockOpt.

CAsyncSocket::Connect

Llame a esta función miembro para establecer una conexión a un socket de datagrama o secuencia no conectado.

BOOL Connect(
    LPCTSTR lpszHostAddress,
    UINT nHostPort);

BOOL Connect(
    const SOCKADDR* lpSockAddr,
    int nSockAddrLen);

Parámetros

lpszHostAddress
Dirección de red del socket al que está conectado este objeto: puede ser un nombre de equipo, como "ftp.microsoft.com", o números separados por puntos, como "128.56.22.8".

nHostPort
Puerto que identifica la aplicación de socket.

lpSockAddr
Puntero a una estructura SOCKADDR que contiene la dirección del socket conectado.

nSockAddrLen
Longitud de la dirección en lpSockAddr, en bytes.

Valor devuelto

Distinto de cero si la función es correcta; de lo contrario, 0. Además, se puede recuperar un código de error específico mediante una llamada a GetLastError. Si esto indica un código de error de WSAEWOULDBLOCK y la aplicación usa las devoluciones de llamada que pueden invalidarse, la aplicación recibirá un mensaje OnConnect cuando la operación de conexión se complete. Los siguientes errores se aplican a esta función miembro:

  • WSANOTINITIALISEDAfxSocketInit debe producirse correctamente para poder usar esta API.

  • WSAENETDOWN La implementación de Windows Sockets ha detectado que se ha producido un error en el subsistema de red.

  • WSAEADDRINUSE La dirección especificada ya está en uso

  • WSAEINPROGRESS Hay una llamada de Windows Sockets de bloqueo en curso.

  • WSAEADDRNOTAVAIL La dirección especificada no está disponible en el equipo local.

  • WSAEAFNOSUPPORT Las direcciones de la familia especificada no se pueden usar con este socket.

  • WSAECONNREFUSED El intento de conexión se rechazó.

  • WSAEDESTADDRREQ Se requiere una dirección de destino.

  • WSAEFAULT El argumento nSockAddrLen es incorrecto.

  • WSAEINVAL Dirección de host no válida.

  • WSAEISCONN El socket ya está conectado.

  • WSAEMFILE No hay más descriptores de archivo disponibles.

  • WSAENETUNREACH No se puede acceder a la red desde este host en estos momentos.

  • WSAENOBUFS No hay espacio disponible en el búfer. El socket no se puede conectar.

  • WSAENOTSOCK El descriptor no es un socket.

  • WSAETIMEDOUT Se ha agotado el tiempo de espera de la conexión sin poder establecer una conexión.

  • WSAEWOULDBLOCK El socket está marcado como de no bloqueo y la conexión no puede completarse inmediatamente.

Comentarios

Si el socket no está enlazado, el sistema asigna valores únicos a la asociación local y el socket se marca como enlazado. Cabe decir que si el campo de dirección de la estructura de nombre contiene solo ceros, Connect devolverá cero. Para obtener información ampliada sobre algún error, llame a la función miembro GetLastError.

En los sockets de secuencias (de tipo SOCK_STREAM), se inicia una conexión activa al host externo. Cuando la llamada del socket se completa correctamente, el socket estará listo para enviar o recibir datos.

En los sockets de datagrama (de tipo SOCK_DGRAM), se establece un destino predeterminado, que se usará en las llamadas posteriores a Send y a Receive.

CAsyncSocket::Create

Llame a la función miembro Create después de construir un objeto de socket para crear el socket de Windows y asociarlo.

BOOL Create(
    UINT nSocketPort = 0,
    int nSocketType = SOCK_STREAM,
    long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE,
    LPCTSTR lpszSocketAddress = NULL);

Parámetros

nSocketPort
Un puerto conocido que se va a usar con el socket, o 0 si desea que Windows Sockets seleccione un puerto.

nSocketType
SOCK_STREAM o SOCK_DGRAM.

lEvent
Máscara de bits que especifica una combinación de eventos de red en los que la aplicación está interesada.

  • FD_READ Se quiere recibir una notificación de preparación de lectura.

  • FD_WRITE Se quiere recibir una notificación de preparación de escritura.

  • FD_OOB Se quiere recibir una notificación cuando lleguen datos fuera de banda.

  • FD_ACCEPT Se quiere recibir una notificación de las conexiones entrantes.

  • FD_CONNECT Se quiere recibir una notificación de conexión completada.

  • FD_CLOSE Se quiere recibir una notificación de cierre de socket.

lpszSockAddress
Puntero a una cadena que contiene la dirección de red del socket conectado, compuesta de números separados por puntos, como "128.56.22.8". Pasar la cadena NULL para este parámetro indica que la instancia CAsyncSocket debe escuchar la actividad del cliente en todas las interfaces de red.

Valor devuelto

Distinto de cero si la función es correcta; de lo contrario, 0. Además, se puede recuperar un código de error específico mediante una llamada a GetLastError. Los siguientes errores se aplican a esta función miembro:

  • WSANOTINITIALISEDAfxSocketInit debe producirse correctamente para poder usar esta API.

  • WSAENETDOWN La implementación de Windows Sockets ha detectado que se ha producido un error en el subsistema de red.

  • WSAEAFNOSUPPORT La familia de direcciones especificada no se admite.

  • WSAEINPROGRESS Hay una operación de Windows Sockets de bloqueo en curso.

  • WSAEMFILE No hay más descriptores de archivo disponibles.

  • WSAENOBUFS No hay espacio disponible en el búfer. El socket no se puede crear.

  • WSAEPROTONOSUPPORT El puerto especificado no se admite.

  • WSAEPROTOTYPE El puerto especificado es de un tipo incorrecto para este socket.

  • WSAESOCKTNOSUPPORT El tipo de socket especificado no se admite en esta familia de direcciones.

Comentarios

Create llama a Socket y, si la llamada se completa correctamente, llama a Bind para enlazar el socket a la dirección especificada. Se admiten los siguientes tipos de socket:

  • SOCK_STREAM Proporciona secuencias de bytes secuenciadas, confiables, de dúplex completo y bidireccionales basadas en conexiones. Usa el Protocolo de control de transmisión (TCP) con la familia de direcciones de Internet.

  • SOCK_DGRAM Admite datagramas, que son paquetes no confiables sin conexión con una longitud máxima fija (normalmente corta). Usa el Protocolo de datagrama de usuario (UDP) con la familia de direcciones de Internet.

    Nota:

    La función miembro Accept toma una referencia a un objeto CSocket nuevo y vacío como parámetro. Debe construir este objeto antes de llamar a Accept. Tenga en cuenta que si este objeto de socket se sale del ámbito, la conexión se cierra. No llame a Create para este nuevo objeto de socket.

Importante

Createno es seguro con los subprocesos. Si va a llamarlo en un entorno multiproceso, en el que otros subprocesos diferentes podrían invocarlo al mismo tiempo, asegúrese de proteger cada llamada con una exclusión mutua u otro bloqueo de sincronización.

Para obtener más información sobre los sockets de secuencias y de datagrama, consulte los artículos Windows Sockets: Información de contexto, Windows Sockets: Puertos y direcciones de sockets y API de Windows Sockets 2.

CAsyncSocket::CreateEx

Llame a la función miembro CreateEx después de construir un objeto de socket para crear el socket de Windows y asociarlo.

Use esta función cuando necesite proporcionar opciones avanzadas, como el tipo de socket.

BOOL CreateEx(
    ADDRINFOT* pAI,
    long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE);

Parámetros

pAI
Puntero a un objeto ADDRINFOT para contener información de socket, como la familia y el tipo de socket.

lEvent
Máscara de bits que especifica una combinación de eventos de red en los que la aplicación está interesada.

  • FD_READ Se quiere recibir una notificación de preparación de lectura.

  • FD_WRITE Se quiere recibir una notificación de preparación de escritura.

  • FD_OOB Se quiere recibir una notificación cuando lleguen datos fuera de banda.

  • FD_ACCEPT Se quiere recibir una notificación de las conexiones entrantes.

  • FD_CONNECT Se quiere recibir una notificación de conexión completada.

  • FD_CLOSE Se quiere recibir una notificación de cierre de socket.

Valor devuelto

Vea el valor devuelto de Create().

Comentarios

Consulte los comentarios sobre Create().

CAsyncSocket::Detach

Llame a esta función miembro para desasociar el identificador de SOCKET del miembro de datos m_hSocket del objeto CAsyncSocket y establezca m_hSocket en NULL.

SOCKET Detach();

CAsyncSocket::FromHandle

Devuelve un puntero a un objeto CAsyncSocket.

static CAsyncSocket* PASCAL FromHandle(SOCKET hSocket);

Parámetros

hSocket
Contiene un identificador a un socket.

Valor devuelto

Puntero a un objeto CAsyncSocket o NULL si no hay ningún objeto CAsyncSocket asociado a hSocket.

Comentarios

Cuando se le asigna un identificador SOCKET, si un objeto CAsyncSocket no está asociado al identificador, la función miembro devuelve NULL.

CAsyncSocket::GetLastError

Llame a esta función miembro para obtener el estado de error de la última operación que produjo un error.

static int PASCAL GetLastError();

Valor devuelto

El valor devuelto indica el código de error de la última rutina de la API de Windows Sockets realizada por este subproceso.

Comentarios

Cuando una función miembro determinada indica que se ha producido un error, se debe llamar a GetLastError para recuperar el código de error correspondiente. Consulte las descripciones de funciones miembro individuales para obtener una lista de códigos de error relevantes.

Para obtener más información sobre los códigos de error, consulte API de Windows Sockets 2.

CAsyncSocket::GetPeerName

Llame a esta función miembro para obtener la dirección del socket del mismo nivel al que está conectado este socket.

BOOL GetPeerName(
    CString& rPeerAddress,
    UINT& rPeerPort);

BOOL GetPeerName(
    SOCKADDR* lpSockAddr,
    int* lpSockAddrLen);

Parámetros

rPeerAddress
Referencia a un objeto CString que recibe una dirección IP compuesta de números separados por puntos.

rPeerPort
Referencia a un objeto UINT que almacena un puerto.

lpSockAddr
Puntero a la estructura SOCKADDR que recibe el nombre del socket del mismo nivel.

lpSockAddrLen
Puntero a la longitud de la dirección en lpSockAddr, en bytes. Al regresar, el argumento lpSockAddrLen contiene el tamaño real de lpSockAddr devuelto en bytes.

Valor devuelto

Distinto de cero si la función es correcta; de lo contrario, 0. Además, se puede recuperar un código de error específico mediante una llamada a GetLastError. Los siguientes errores se aplican a esta función miembro:

  • WSANOTINITIALISEDAfxSocketInit debe producirse correctamente para poder usar esta API.

  • WSAENETDOWN La implementación de Windows Sockets ha detectado que se ha producido un error en el subsistema de red.

  • WSAEFAULT El argumento lpSockAddrLen no es lo suficientemente grande.

  • WSAEINPROGRESS Hay una llamada de Windows Sockets de bloqueo en curso.

  • WSAENOTCONN El socket no está conectado.

  • WSAENOTSOCK El descriptor no es un socket.

Comentarios

Para controlar las direcciones IPv6, use CAsyncSocket::GetPeerNameEx.

CAsyncSocket::GetPeerNameEx

Llame a esta función miembro para obtener la dirección del socket del mismo nivel al que está conectado este socket (controla las direcciones IPv6).

BOOL GetPeerNameEx(
    CString& rPeerAddress,
    UINT& rPeerPort);

Parámetros

rPeerAddress
Referencia a un objeto CString que recibe una dirección IP compuesta de números separados por puntos.

rPeerPort
Referencia a un objeto UINT que almacena un puerto.

Valor devuelto

Distinto de cero si la función es correcta; de lo contrario, 0. Además, se puede recuperar un código de error específico mediante una llamada a GetLastError. Los siguientes errores se aplican a esta función miembro:

  • WSANOTINITIALISEDAfxSocketInit debe producirse correctamente para poder usar esta API.

  • WSAENETDOWN La implementación de Windows Sockets ha detectado que se ha producido un error en el subsistema de red.

  • WSAEFAULT El argumento lpSockAddrLen no es lo suficientemente grande.

  • WSAEINPROGRESS Hay una llamada de Windows Sockets de bloqueo en curso.

  • WSAENOTCONN El socket no está conectado.

  • WSAENOTSOCK El descriptor no es un socket.

Comentarios

Esta función es la misma que CAsyncSocket::GetPeerName, salvo que controla las direcciones IPv6, así como los protocolos más antiguos.

CAsyncSocket::GetSockName

Llame a esta función miembro para obtener el nombre local de un socket.

BOOL GetSockName(
    CString& rSocketAddress,
    UINT& rSocketPort);

BOOL GetSockName(
    SOCKADDR* lpSockAddr,
    int* lpSockAddrLen);

Parámetros

rSocketAddress
Referencia a un objeto CString que recibe una dirección IP compuesta de números separados por puntos.

rSocketPort
Referencia a un objeto UINT que almacena un puerto.

lpSockAddr
Puntero a una estructura SOCKADDR que recibe la dirección del socket.

lpSockAddrLen
Puntero a la longitud de la dirección en lpSockAddr, en bytes.

Valor devuelto

Distinto de cero si la función es correcta; de lo contrario, 0. Además, se puede recuperar un código de error específico mediante una llamada a GetLastError. Los siguientes errores se aplican a esta función miembro:

  • WSANOTINITIALISEDAfxSocketInit debe producirse correctamente para poder usar esta API.

  • WSAENETDOWN La implementación de Windows Sockets ha detectado que se ha producido un error en el subsistema de red.

  • WSAEFAULT El argumento lpSockAddrLen no es lo suficientemente grande.

  • WSAEINPROGRESS Hay una operación de Windows Sockets de bloqueo en curso.

  • WSAENOTSOCK El descriptor no es un socket.

  • WSAEINVAL El socket no se ha enlazado a una dirección con Bind.

Comentarios

Esta llamada es especialmente útil cuando se ha hecho una llamada a Connect sin realizar antes una operación Bind; esta llamada proporciona los únicos medios por los que se puede determinar la asociación local que el sistema ha establecido.

Para controlar las direcciones IPv6, use CAsyncSocket::GetSockNameEx.

CAsyncSocket::GetSockNameEx

Llame a esta función miembro para obtener el nombre local de un socket (controla las direcciones IPv6).

BOOL GetSockNameEx(
    CString& rSocketAddress,
    UINT& rSocketPort);

Parámetros

rSocketAddress
Referencia a un objeto CString que recibe una dirección IP compuesta de números separados por puntos.

rSocketPort
Referencia a un objeto UINT que almacena un puerto.

Valor devuelto

Distinto de cero si la función es correcta; de lo contrario, 0. Además, se puede recuperar un código de error específico mediante una llamada a GetLastError. Los siguientes errores se aplican a esta función miembro:

  • WSANOTINITIALISEDAfxSocketInit debe producirse correctamente para poder usar esta API.

  • WSAENETDOWN La implementación de Windows Sockets ha detectado que se ha producido un error en el subsistema de red.

  • WSAEFAULT El argumento lpSockAddrLen no es lo suficientemente grande.

  • WSAEINPROGRESS Hay una operación de Windows Sockets de bloqueo en curso.

  • WSAENOTSOCK El descriptor no es un socket.

  • WSAEINVAL El socket no se ha enlazado a una dirección con Bind.

Comentarios

Esta llamada es la misma que CAsyncSocket::GetSockName, salvo que controla las direcciones IPv6, así como los protocolos más antiguos.

Esta llamada es especialmente útil cuando se ha hecho una llamada a Connect sin realizar antes una operación Bind; esta llamada proporciona los únicos medios por los que se puede determinar la asociación local que el sistema ha establecido.

CAsyncSocket::GetSockOpt

Llame a esta función miembro para recuperar una opción de socket.

BOOL GetSockOpt(
    int nOptionName,
    void* lpOptionValue,
    int* lpOptionLen,
    int nLevel = SOL_SOCKET);

Parámetros

nOptionName
Opción de socket para la que se va a recuperar el valor.

lpOptionValue
Puntero al búfer en el que se va a devolver el valor de la opción solicitada. El valor asociado a la opción seleccionada se devuelve en el búfer lpOptionValue. El entero al que lpOptionLen apunta debe contener originalmente el tamaño de este búfer en bytes; y en la devolución, se establecerá en el tamaño del valor devuelto. En SO_LINGER, este valor será el tamaño de una estructura LINGER; en todas las demás opciones, será el tamaño de un objeto BOOL o int, dependiendo de la opción. Consulte la lista de opciones y sus tamaños en la sección Comentarios.

lpOptionLen
Puntero al tamaño del búfer lpOptionValue en bytes.

nLevel
Nivel en el que se define la opción; los únicos niveles admitidos son SOL_SOCKET y IPPROTO_TCP.

Valor devuelto

Distinto de cero si la función es correcta; de lo contrario, 0. Además, se puede recuperar un código de error específico mediante una llamada a GetLastError. Si nunca se estableció una opción con SetSockOpt, GetSockOpt devuelve el valor predeterminado de la opción. Los siguientes errores se aplican a esta función miembro:

  • WSANOTINITIALISEDAfxSocketInit debe producirse correctamente para poder usar esta API.

  • WSAENETDOWN La implementación de Windows Sockets ha detectado que se ha producido un error en el subsistema de red.

  • WSAEFAULT El argumento lpOptionLen no era válido.

  • WSAEINPROGRESS Hay una operación de Windows Sockets de bloqueo en curso.

  • WSAENOPROTOOPT La opción es desconocida o no se admite. En concreto, SO_BROADCAST no se admite en sockets de tipo SOCK_STREAM, mientras que SO_ACCEPTCONN, SO_DONTLINGER, SO_KEEPALIVE, SO_LINGER y SO_OOBINLINE no se admiten en sockets de tipo SOCK_DGRAM.

  • WSAENOTSOCK El descriptor no es un socket.

Comentarios

GetSockOpt recupera el valor actual de una opción de socket asociada a un socket de cualquier tipo y en cualquier estado, y almacena el resultado en lpOptionValue. Las opciones afectan a las operaciones de socket, como el enrutamiento de paquetes, la transferencia de datos fuera de banda, etc.

En GetSockOpt se admiten las siguientes opciones. La columna Tipo refleja el tipo de datos tratado por lpOptionValue. La opción TCP_NODELAY usa el nivel IPPROTO_TCP; todas las demás opciones usan el nivel SOL_SOCKET.

Valor Tipo Significado
SO_ACCEPTCONN BOOL El socket se encuentra a la escucha.
SO_BROADCAST BOOL El socket está configurado para la transmisión de mensajes de difusión.
SO_DEBUG BOOL La depuración está habilitada.
SO_DONTLINGER BOOL Si es true, la opción SO_LINGER está deshabilitada.
SO_DONTROUTE BOOL El enrutamiento está deshabilitado.
SO_ERROR int Obtiene el estado de error y lo borra.
SO_KEEPALIVE BOOL Se envía el mantenimiento de conexiones abiertas.
SO_LINGER struct LINGER Devuelve las opciones de persistencia actuales.
SO_OOBINLINE BOOL Se reciben datos fuera de banda en el flujo de datos normal.
SO_RCVBUF int Tamaño del búfer de recepciones.
SO_REUSEADDR BOOL El socket se puede enlazar a una dirección que ya está en uso.
SO_SNDBUF int Tamaño del búfer de envíos.
SO_TYPE int Tipo del socket (por ejemplo, SOCK_STREAM).
TCP_NODELAY BOOL Deshabilita el algoritmo de Nagle para la fusión de envíos.

Estas son las opciones de Berkeley Software Distribution (BSD) que no se admiten con GetSockOpt:

Valor Tipo Significado
SO_RCVLOWAT int Marca de agua mínima de recepción.
SO_RCVTIMEO int Tiempo de espera de recepción.
SO_SNDLOWAT int Marca de agua mínima de envío.
SO_SNDTIMEO int Tiempo de espera de envío.
IP_OPTIONS Obtiene opciones en el encabezado IP.
TCP_MAXSEG int Obtiene el tamaño de segmento máximo de TCP.

Si se llama a GetSockOpt con una opción no admitida, se generará un código de error WSAENOPROTOOPT devuelto desde GetLastError.

CAsyncSocket::IOCtl

Llame a esta función miembro para controlar el modo de un socket.

BOOL IOCtl(
    long lCommand,
    DWORD* lpArgument);

Parámetros

lCommand
Comando que se va a realizar en el socket.

lpArgument
Puntero a un parámetro de lCommand.

Valor devuelto

Distinto de cero si la función es correcta; de lo contrario, 0. Además, se puede recuperar un código de error específico mediante una llamada a GetLastError. Los siguientes errores se aplican a esta función miembro:

  • WSANOTINITIALISEDAfxSocketInit debe producirse correctamente para poder usar esta API.

  • WSAENETDOWN La implementación de Windows Sockets ha detectado que se ha producido un error en el subsistema de red.

  • WSAEINVALlCommand no es un comando válido o lpArgument no es un parámetro aceptable en lCommand, o el uso del comando no procede con el tipo de socket proporcionado.

  • WSAEINPROGRESS Hay una operación de Windows Sockets de bloqueo en curso.

  • WSAENOTSOCK El descriptor no es un socket.

Comentarios

Esta rutina se puede usar en cualquier socket en cualquier estado. Se usa para obtener o recuperar parámetros operativos asociados al socket, independientemente del subsistema de comunicaciones y el protocolo. Se admiten los siguientes comandos:

  • FIONBIO Habilite o deshabilite el modo de no bloqueo en el socket. El parámetro lpArgument apunta a un valor DWORD, que es distinto de cero si el modo de no bloqueo se va a habilitar y cero si se va a deshabilitar. Si AsyncSelect se ha emitido en un socket, cualquier intento de usar IOCtl para volver a establecer el socket en modo de bloqueo producirá un error en WSAEINVAL. Para volver a establecer el socket en el modo de bloqueo y soslayar el error WSAEINVAL, primero una aplicación debe deshabilitar AsyncSelect mediante una llamada a AsyncSelect con el parámetro lEvent igual a 0 y, a continuación, llamar a IOCtl.

  • FIONREAD Determine el número máximo de bytes que se pueden leer con una llamada a Receive desde este socket. El parámetro lpArgument apunta a un valor DWORD en el que IOCtl almacena el resultado. Si este socket es de tipo SOCK_STREAM, FIONREAD devuelve la cantidad total de datos que se pueden leer en un solo objeto Receive; suele equivaler a la cantidad total de datos en cola en el socket. Si este socket es de tipo SOCK_DGRAM, FIONREAD devuelve el tamaño del primer datagrama en cola en el socket.

  • SIOCATMARK Determine si se han leído todos los datos fuera de banda. Esto solo es válido en sockets de tipo SOCK_STREAM que se han configurado para la recepción en línea de datos fuera de banda (SO_OOBINLINE). Si no hay datos fuera de banda a la espera de ser leídos, la operación devuelve un valor distinto de cero. De lo contrario, devuelve 0, y la siguiente operación Receive o ReceiveFrom realizada en el socket recuperará algunos o todos los datos anteriores a la "marca"; la aplicación debe usar la operación SIOCATMARK para determinar si queda algún dato. Si hay datos normales anteriores a los datos "urgentes" (fuera de banda), se recibirán en orden (tenga en cuenta que en una operación Receive o ReceiveFrom nunca se mezclarán datos fuera de banda y datos normales en una misma llamada). El parámetro lpArgument apunta a un valor DWORD en el que IOCtl almacena el resultado.

Esta función es un subconjunto de ioctl() tal y como se usa en sockets Berkeley. En concreto, no hay ningún comando que sea equivalente a FIOASYNC, mientras que SIOCATMARK es el único comando de nivel de socket que se admite.

CAsyncSocket::Listen

Llame a esta función miembro para escuchar las solicitudes de conexión entrantes.

BOOL Listen(int nConnectionBacklog = 5);

Parámetros

nConnectionBacklog
Longitud máxima que puede crecer la cola de conexiones pendientes. El intervalo válido oscila entre 1 y 5.

Valor devuelto

Distinto de cero si la función es correcta; de lo contrario, 0. Además, se puede recuperar un código de error específico mediante una llamada a GetLastError. Los siguientes errores se aplican a esta función miembro:

  • WSANOTINITIALISEDAfxSocketInit debe producirse correctamente para poder usar esta API.

  • WSAENETDOWN La implementación de Windows Sockets ha detectado que se ha producido un error en el subsistema de red.

  • WSAEADDRINUSE Se ha intentado escuchar en una dirección que está en uso.

  • WSAEINPROGRESS Hay una operación de Windows Sockets de bloqueo en curso.

  • WSAEINVAL El socket no se ha enlazado a Bind o ya está conectado.

  • WSAEISCONN El socket ya está conectado.

  • WSAEMFILE No hay más descriptores de archivo disponibles.

  • WSAENOBUFS No hay espacio disponible en el búfer.

  • WSAENOTSOCK El descriptor no es un socket.

  • WSAEOPNOTSUPP El socket al que se hace referencia no es de un tipo que admita la operación Listen.

Comentarios

Para aceptar conexiones, el socket se crea primero con Create, se especifica un trabajo pendiente para las conexiones entrantes con Listen y, luego, se aceptan las conexiones con Accept. Listen es válido únicamente en sockets que admiten conexiones, es decir, los de tipo SOCK_STREAM. Este socket se pone en modo "pasivo", donde el proceso reconoce y pone en cola las conexiones entrantes pendientes de aceptación.

Esta función suelen usarla los servidores (o cualquier aplicación que quiera aceptar conexiones), que son susceptibles de tener más de una solicitud de conexión simultánea: si una solicitud de conexión llega con la cola llena, el cliente recibirá un error con la indicación WSAECONNREFUSED.

Listen intenta seguir funcionando racionalmente cuando no hay puertos (descriptores) disponibles. Aceptará conexiones hasta que la cola se vacíe. Si hay puertos disponibles, una llamada posterior a Listen o a Accept rellenará la cola en el "trabajo pendiente" actual o más reciente (si es posible) y reanudará la escucha de conexiones entrantes.

CAsyncSocket::m_hSocket

Contiene el identificador SOCKET del socket encapsulado por este objeto CAsyncSocket.

SOCKET m_hSocket;

CAsyncSocket::OnAccept

El marco llama a esta función para notificar a un socket de escucha que puede aceptar solicitudes de conexión pendientes mediante una llamada a la función miembro Accept.

virtual void OnAccept(int nErrorCode);

Parámetros

nErrorCode
El error más reciente en un socket. Los siguientes códigos de error son de aplicación en la función miembro OnAccept:

  • 0 La función se ha realizado correctamente.

  • WSAENETDOWN La implementación de Windows Sockets ha detectado que se ha producido un error en el subsistema de red.

Comentarios

Para obtener más información, vea Windows Sockets: Notificaciones de socket.

CAsyncSocket::OnClose

El marco llama a esta función para notificar a este socket que el socket conectado lo ha cerrado su proceso correspondiente.

virtual void OnClose(int nErrorCode);

Parámetros

nErrorCode
El error más reciente en un socket. Los siguientes códigos de error son de aplicación en la función miembro OnClose:

  • 0 La función se ha realizado correctamente.

  • WSAENETDOWN La implementación de Windows Sockets ha detectado que se ha producido un error en el subsistema de red.

  • WSAECONNRESET El lado remoto ha restablecido la conexión.

  • WSAECONNABORTEDLa conexión se ha anulado porque se ha agotado el tiempo de espera o debido a otro error.

Comentarios

Para obtener más información, vea Windows Sockets: Notificaciones de socket.

CAsyncSocket::OnConnect

El marco llama a esta función para notificar a este socket de conexión que su intento de conexión se ha completado, ya sea correctamente o con errores.

virtual void OnConnect(int nErrorCode);

Parámetros

nErrorCode
El error más reciente en un socket. Los siguientes códigos de error son de aplicación en la función miembro OnConnect:

  • 0 La función se ha realizado correctamente.

  • WSAEADDRINUSE La dirección especificada ya está en uso

  • WSAEADDRNOTAVAIL La dirección especificada no está disponible en el equipo local.

  • WSAEAFNOSUPPORT Las direcciones de la familia especificada no se pueden usar con este socket.

  • WSAECONNREFUSED El intento de conexión se ha rechazado a la fuerza.

  • WSAEDESTADDRREQ Se requiere una dirección de destino.

  • WSAEFAULT El argumento lpSockAddrLen es incorrecto.

  • WSAEINVAL El socket ya está enlazado a una dirección.

  • WSAEISCONN El socket ya está conectado.

  • WSAEMFILE No hay más descriptores de archivo disponibles.

  • WSAENETUNREACH No se puede acceder a la red desde este host en estos momentos.

  • WSAENOBUFS No hay espacio disponible en el búfer. El socket no se puede conectar.

  • WSAENOTCONN El socket no está conectado.

  • WSAENOTSOCK El descriptor es un archivo, no un socket.

  • WSAETIMEDOUT Se ha agotado el tiempo de espera de la conexión sin poder establecer una conexión.

Comentarios

Nota:

En CSocket, nunca se llama a la función de notificación OnConnect. En el caso de las conexiones, basta con llamar a Connect, que regresa cuando se completa la conexión (ya sea correctamente o con errores). La forma en que se controlan las notificaciones de conexión es un detalle de implementación de MFC.

Para obtener más información, vea Windows Sockets: Notificaciones de socket.

Ejemplo

void CMyAsyncSocket::OnConnect(int nErrorCode) // CMyAsyncSocket is
                                               // derived from CAsyncSocket
{
   if (0 != nErrorCode)
   {
      switch (nErrorCode)
      {
      case WSAEADDRINUSE:
         AfxMessageBox(_T("The specified address is already in use.\n"));
         break;
      case WSAEADDRNOTAVAIL:
         AfxMessageBox(_T("The specified address is not available from ")
                       _T("the local machine.\n"));
         break;
      case WSAEAFNOSUPPORT:
         AfxMessageBox(_T("Addresses in the specified family cannot be ")
                       _T("used with this socket.\n"));
         break;
      case WSAECONNREFUSED:
         AfxMessageBox(_T("The attempt to connect was forcefully rejected.\n"));
         break;
      case WSAEDESTADDRREQ:
         AfxMessageBox(_T("A destination address is required.\n"));
         break;
      case WSAEFAULT:
         AfxMessageBox(_T("The lpSockAddrLen argument is incorrect.\n"));
         break;
      case WSAEINVAL:
         AfxMessageBox(_T("The socket is already bound to an address.\n"));
         break;
      case WSAEISCONN:
         AfxMessageBox(_T("The socket is already connected.\n"));
         break;
      case WSAEMFILE:
         AfxMessageBox(_T("No more file descriptors are available.\n"));
         break;
      case WSAENETUNREACH:
         AfxMessageBox(_T("The network cannot be reached from this host ")
                       _T("at this time.\n"));
         break;
      case WSAENOBUFS:
         AfxMessageBox(_T("No buffer space is available. The socket ")
                       _T("cannot be connected.\n"));
         break;
      case WSAENOTCONN:
         AfxMessageBox(_T("The socket is not connected.\n"));
         break;
      case WSAENOTSOCK:
         AfxMessageBox(_T("The descriptor is a file, not a socket.\n"));
         break;
      case WSAETIMEDOUT:
         AfxMessageBox(_T("The attempt to connect timed out without ")
                       _T("establishing a connection. \n"));
         break;
      default:
         TCHAR szError[256];
         _stprintf_s(szError, _T("OnConnect error: %d"), nErrorCode);
         AfxMessageBox(szError);
         break;
      }
      AfxMessageBox(_T("Please close the application"));
   }
   CAsyncSocket::OnConnect(nErrorCode);
}

CAsyncSocket::OnOutOfBandData

El marco llama a esta función para notificar al socket receptor que el socket de envío tiene datos fuera de banda que se van a enviar.

virtual void OnOutOfBandData(int nErrorCode);

Parámetros

nErrorCode
El error más reciente en un socket. Los siguientes códigos de error son de aplicación en la función miembro OnOutOfBandData:

  • 0 La función se ha realizado correctamente.

  • WSAENETDOWN La implementación de Windows Sockets ha detectado que se ha producido un error en el subsistema de red.

Comentarios

Los datos fuera de banda son un canal lógicamente independiente que está asociado a cada par de sockets conectados de tipo SOCK_STREAM. Por lo general, el canal se usa para enviar datos urgentes.

MFC admite datos fuera de banda, pero no se recomienda que los usuarios de la clase CAsyncSocket lo utilicen. Es más fácil crear un segundo socket para pasar esos datos. Para obtener más información sobre los datos fuera de banda, vea Windows Sockets: Notificaciones de socket.

CAsyncSocket::OnReceive

El marco llama a esta función para notificar a este socket que hay datos en el búfer que se pueden recuperar llamando a la función miembro Receive.

virtual void OnReceive(int nErrorCode);

Parámetros

nErrorCode
El error más reciente en un socket. Los siguientes códigos de error son de aplicación en la función miembro OnReceive:

  • 0 La función se ha realizado correctamente.

  • WSAENETDOWN La implementación de Windows Sockets ha detectado que se ha producido un error en el subsistema de red.

Comentarios

Para obtener más información, vea Windows Sockets: Notificaciones de socket.

Ejemplo

void CMyAsyncSocket::OnReceive(int nErrorCode) // CMyAsyncSocket is
                                               // derived from CAsyncSocket
{
  static int i = 0;

  i++;

  TCHAR buff[4096];
  int nRead;
  nRead = Receive(buff, 4096);

  switch (nRead)
  {
  case 0:
    Close();
    break;
  case SOCKET_ERROR:
    if (GetLastError() != WSAEWOULDBLOCK)
    {
      AfxMessageBox(_T("Error occurred"));
      Close();
    }
    break;
  default:
    buff[nRead] = _T('\0'); //terminate the string
    CString szTemp(buff);
    m_strRecv += szTemp; // m_strRecv is a CString declared
                         // in CMyAsyncSocket
    if (szTemp.CompareNoCase(_T("bye")) == 0)
    {
      ShutDown();
      s_eventDone.SetEvent();
    }
  }
  CAsyncSocket::OnReceive(nErrorCode);
}

CAsyncSocket::OnSend

El marco llama a esta función para notificar al socket que ahora puede enviar datos mediante una llamada a la función miembro Send.

virtual void OnSend(int nErrorCode);

Parámetros

nErrorCode
El error más reciente en un socket. Los siguientes códigos de error son de aplicación en la función miembro OnSend:

  • 0 La función se ha realizado correctamente.

  • WSAENETDOWN La implementación de Windows Sockets ha detectado que se ha producido un error en el subsistema de red.

Comentarios

Para obtener más información, vea Windows Sockets: Notificaciones de socket.

Ejemplo

// CMyAsyncSocket is derived from CAsyncSocket and defines the
// following variables:
//    CString  m_sendBuffer;   //for async send
//    int      m_nBytesSent;
//    int      m_nBytesBufferSize;
void CMyAsyncSocket::OnSend(int nErrorCode)
{
   while (m_nBytesSent < m_nBytesBufferSize)
   {
      int dwBytes;

      if ((dwBytes = Send((LPCTSTR)m_sendBuffer + m_nBytesSent,
                          m_nBytesBufferSize - m_nBytesSent)) == SOCKET_ERROR)
      {
         if (GetLastError() == WSAEWOULDBLOCK)
         {
            break;
         }
         else
         {
            TCHAR szError[256];
            _stprintf_s(szError, _T("Server Socket failed to send: %d"),
                        GetLastError());
            Close();
            AfxMessageBox(szError);
         }
      }
      else
      {
         m_nBytesSent += dwBytes;
      }
   }

   if (m_nBytesSent == m_nBytesBufferSize)
   {
      m_nBytesSent = m_nBytesBufferSize = 0;
      m_sendBuffer = _T("");
   }

   CAsyncSocket::OnSend(nErrorCode);
}

CAsyncSocket::operator =

Asigna un nuevo valor a un objeto CAsyncSocket.

void operator=(const CAsyncSocket& rSrc);

Parámetros

rSrc
El valor de este parámetro se corresponde con una referencia a un objeto CAsyncSocket existente.

Comentarios

Llame a esta función para copiar un objeto CAsyncSocket existente en otro objeto CAsyncSocket.

CAsyncSocket::operator SOCKET

Use este operador para recuperar el identificador SOCKET del objeto CAsyncSocket.

operator SOCKET() const;

Valor devuelto

Si se ejecuta correctamente, el manipulador del objeto SOCKET; de lo contrario, NULL.

Comentarios

Puede usar el manipulador para llamar directamente a las API de Windows.

CAsyncSocket::Receive

Llame a esta función miembro para recibir datos de un socket.

virtual int Receive(
    void* lpBuf,
    int nBufLen,
    int nFlags = 0);

Parámetros

lpBuf
Un búfer para los datos entrantes.

nBufLen
La longitud de lpBuf en bytes.

nFlags
Especifica la forma en que se realiza la llamada. La semántica de esta función viene determinada por las opciones de socket y el parámetro nFlags. Este último se construye combinando cualquiera de los siguientes valores con el operador OR bit a bit de C++ (|):

  • MSG_PEEK Inspecciona los datos entrantes. Los datos se copian en el búfer, pero no se quitan de la cola de entrada.

  • MSG_OOB Procesa los datos fuera de banda.

Valor devuelto

Si no se produce ningún error, Receive devuelve el número de bytes recibidos. Si la conexión se ha cerrado, devuelve 0. De lo contrario, devuelve un valor SOCKET_ERROR, y se puede recuperar un código de error específico llamando a GetLastError. Los siguientes errores se aplican a esta función miembro:

  • WSANOTINITIALISEDAfxSocketInit debe producirse correctamente para poder usar esta API.

  • WSAENETDOWN La implementación de Windows Sockets ha detectado que se ha producido un error en el subsistema de red.

  • WSAENOTCONN El socket no está conectado.

  • WSAEINPROGRESS Hay una operación de Windows Sockets de bloqueo en curso.

  • WSAENOTSOCK El descriptor no es un socket.

  • WSAEOPNOTSUPPMSG_OOB se ha especificado, pero el socket no es de tipo SOCK_STREAM.

  • WSAESHUTDOWN El socket está apagado; no es posible llamar a Receive en un socket después de haber invocado a ShutDown con nHow establecido en 0 o 2.

  • WSAEWOULDBLOCK El socket está marcado como de no bloqueo y la operación Receive supondría un bloqueo.

  • WSAEMSGSIZE El mensaje era demasiado grande para caber en el búfer especificado y se ha truncado.

  • WSAEINVAL El socket no se ha enlazado a Bind.

  • WSAECONNABORTED El circuito virtual se ha anulado porque se ha agotado el tiempo de espera o debido a otro error.

  • WSAECONNRESET El lado remoto ha restablecido el circuito virtual.

Comentarios

Esta función se usa con sockets de secuencias o de datagrama conectados, y sirve para leer datos entrantes.

En el caso de los sockets de tipo SOCK_STREAM, se devuelve tanta información como haya disponible actualmente, hasta el tamaño del búfer proporcionado. Si el socket se ha configurado para la recepción en línea de datos fuera de banda (opción de socket SO_OOBINLINE) y los datos fuera de banda están sin leer, solo se devolverán datos fuera de banda. La aplicación puede usar la opción IOCtlSIOCATMARK u OnOutOfBandData para determinar si quedan más datos fuera de banda sin leer.

En los sockets de datagrama, los datos se extraen del primer datagrama en cola, hasta el tamaño del búfer proporcionado. Si el datagrama es mayor que el búfer proporcionado, el búfer se rellena con la primera parte del datagrama, el exceso de datos se pierde y Receive devuelve un valor de SOCKET_ERROR con el código de error establecido en WSAEMSGSIZE. Si no hay datos entrantes disponibles en el socket, se devuelve un valor de SOCKET_ERROR con el código de error establecido en WSAEWOULDBLOCK. La función de devolución de llamada OnReceive se puede usar para determinar cuándo van a llegar más datos.

Si el socket es de tipo SOCK_STREAM y el lado remoto ha apagado correctamente la conexión, una operación Receive se completará inmediatamente con 0 bytes recibidos. Si la conexión se ha restablecido, Receive generará el error WSAECONNRESET.

Receive solo se debe llamar una vez por cada vez que se llame a CAsyncSocket::OnReceive.

Ejemplo

Vea el ejemplo de CAsyncSocket::OnReceive.

CAsyncSocket::ReceiveFrom

Llame a esta función miembro para recibir un datagrama y almacenar la dirección de origen en la estructura SOCKADDR o en rSocketAddress.

int ReceiveFrom(
    void* lpBuf,
    int nBufLen,
    CString& rSocketAddress,
    UINT& rSocketPort,
    int nFlags = 0);

int ReceiveFrom(
    void* lpBuf,
    int nBufLen,
    SOCKADDR* lpSockAddr,
    int* lpSockAddrLen,
    int nFlags = 0);

Parámetros

lpBuf
Un búfer para los datos entrantes.

nBufLen
La longitud de lpBuf en bytes.

rSocketAddress
Referencia a un objeto CString que recibe una dirección IP compuesta de números separados por puntos.

rSocketPort
Referencia a un objeto UINT que almacena un puerto.

lpSockAddr
Puntero a una estructura SOCKADDR que contiene la dirección de origen al regresar.

lpSockAddrLen
Puntero a la longitud de la dirección de origen en lpSockAddr, en bytes.

nFlags
Especifica la forma en que se realiza la llamada. La semántica de esta función viene determinada por las opciones de socket y el parámetro nFlags. Este último se construye combinando cualquiera de los siguientes valores con el operador OR bit a bit de C++ (|):

  • MSG_PEEK Inspecciona los datos entrantes. Los datos se copian en el búfer, pero no se quitan de la cola de entrada.

  • MSG_OOB Procesa los datos fuera de banda.

Valor devuelto

Si no se produce ningún error, ReceiveFrom devuelve el número de bytes recibidos. Si la conexión se ha cerrado, devuelve 0. De lo contrario, devuelve un valor SOCKET_ERROR, y se puede recuperar un código de error específico llamando a GetLastError. Los siguientes errores se aplican a esta función miembro:

  • WSANOTINITIALISEDAfxSocketInit debe producirse correctamente para poder usar esta API.

  • WSAENETDOWN La implementación de Windows Sockets ha detectado que se ha producido un error en el subsistema de red.

  • WSAEFAULT El argumento lpSockAddrLen no era válido: el búfer lpSockAddr era demasiado pequeño como para dar cabida a la dirección del mismo nivel.

  • WSAEINPROGRESS Hay una operación de Windows Sockets de bloqueo en curso.

  • WSAEINVAL El socket no se ha enlazado a Bind.

  • WSAENOTCONN El socket no está conectado (solo SOCK_STREAM).

  • WSAENOTSOCK El descriptor no es un socket.

  • WSAEOPNOTSUPPMSG_OOB se ha especificado, pero el socket no es de tipo SOCK_STREAM.

  • WSAESHUTDOWN El socket está apagado; no es posible llamar a ReceiveFrom en un socket después de haber invocado a ShutDown con nHow establecido en 0 o 2.

  • WSAEWOULDBLOCK El socket está marcado como de no bloqueo y la operación ReceiveFrom supondría un bloqueo.

  • WSAEMSGSIZE El mensaje era demasiado grande para caber en el búfer especificado y se ha truncado.

  • WSAECONNABORTED El circuito virtual se ha anulado porque se ha agotado el tiempo de espera o debido a otro error.

  • WSAECONNRESET El lado remoto ha restablecido el circuito virtual.

Comentarios

Esta función se usa para leer los datos entrantes en un socket (posiblemente conectado) y capturar la dirección desde la que se enviaron los datos.

Para controlar las direcciones IPv6, use CAsyncSocket::ReceiveFromEx.

En el caso de los sockets de tipo SOCK_STREAM, se devuelve tanta información como haya disponible actualmente, hasta el tamaño del búfer proporcionado. Si el socket se ha configurado para la recepción en línea de datos fuera de banda (opción de socket SO_OOBINLINE) y los datos fuera de banda están sin leer, solo se devolverán datos fuera de banda. La aplicación puede usar la opción IOCtlSIOCATMARK u OnOutOfBandData para determinar si quedan más datos fuera de banda sin leer. Los parámetros lpSockAddr y lpSockAddrLen se omiten en los sockets SOCK_STREAM.

En los sockets de datagrama, los datos se extraen del primer datagrama en cola, hasta el tamaño del búfer proporcionado. Si el datagrama es mayor que el búfer proporcionado, el búfer se rellena con la primera parte del mensaje, el exceso de datos se pierde y ReceiveFrom devuelve un valor de SOCKET_ERROR con el código de error establecido en WSAEMSGSIZE.

Si lpSockAddr es distinto de cero y el socket es de tipo SOCK_DGRAM, la dirección de red del socket que envió los datos se copia en la estructura SOCKADDR correspondiente. El valor al que lpSockAddrLen apunta se inicializa en el tamaño de esta estructura y se modifica en la devolución para indicar el tamaño real de la dirección allí almacenada. Si no hay datos entrantes disponibles en el socket, la llamada a ReceiveFrom espera a que lleguen datos, a menos que el socket sea de no bloqueo. En tal caso, se devuelve un valor de SOCKET_ERROR con el código de error establecido en WSAEWOULDBLOCK. La devolución de llamada OnReceive se puede usar para determinar cuándo van a llegar más datos.

Si el socket es de tipo SOCK_STREAM y el lado remoto ha apagado correctamente la conexión, una operación ReceiveFrom se completará inmediatamente con 0 bytes recibidos.

CAsyncSocket::ReceiveFromEx

Llame a esta función miembro para recibir un datagrama y almacenar la dirección de origen en la estructura SOCKADDR o en rSocketAddress (controla las direcciones IPv6).

int ReceiveFromEx(
    void* lpBuf,
    int nBufLen,
    CString& rSocketAddress,
    UINT& rSocketPort,
    int nFlags = 0);

Parámetros

lpBuf
Un búfer para los datos entrantes.

nBufLen
La longitud de lpBuf en bytes.

rSocketAddress
Referencia a un objeto CString que recibe una dirección IP compuesta de números separados por puntos.

rSocketPort
Referencia a un objeto UINT que almacena un puerto.

nFlags
Especifica la forma en que se realiza la llamada. La semántica de esta función viene determinada por las opciones de socket y el parámetro nFlags. Este último se construye combinando cualquiera de los siguientes valores con el operador OR bit a bit de C++ (|):

  • MSG_PEEK Inspecciona los datos entrantes. Los datos se copian en el búfer, pero no se quitan de la cola de entrada.

  • MSG_OOB Procesa los datos fuera de banda.

Valor devuelto

Si no se produce ningún error, ReceiveFromEx devuelve el número de bytes recibidos. Si la conexión se ha cerrado, devuelve 0. De lo contrario, devuelve un valor SOCKET_ERROR, y se puede recuperar un código de error específico llamando a GetLastError. Los siguientes errores se aplican a esta función miembro:

  • WSANOTINITIALISEDAfxSocketInit debe producirse correctamente para poder usar esta API.

  • WSAENETDOWN La implementación de Windows Sockets ha detectado que se ha producido un error en el subsistema de red.

  • WSAEFAULT El argumento lpSockAddrLen no era válido: el búfer lpSockAddr era demasiado pequeño como para dar cabida a la dirección del mismo nivel.

  • WSAEINPROGRESS Hay una operación de Windows Sockets de bloqueo en curso.

  • WSAEINVAL El socket no se ha enlazado a Bind.

  • WSAENOTCONN El socket no está conectado (solo SOCK_STREAM).

  • WSAENOTSOCK El descriptor no es un socket.

  • WSAEOPNOTSUPPMSG_OOB se ha especificado, pero el socket no es de tipo SOCK_STREAM.

  • WSAESHUTDOWN El socket está apagado; no es posible llamar a ReceiveFromEx en un socket después de haber invocado a ShutDown con nHow establecido en 0 o 2.

  • WSAEWOULDBLOCK El socket está marcado como de no bloqueo y la operación ReceiveFromEx supondría un bloqueo.

  • WSAEMSGSIZE El mensaje era demasiado grande para caber en el búfer especificado y se ha truncado.

  • WSAECONNABORTED El circuito virtual se ha anulado porque se ha agotado el tiempo de espera o debido a otro error.

  • WSAECONNRESET El lado remoto ha restablecido el circuito virtual.

Comentarios

Esta función se usa para leer los datos entrantes en un socket (posiblemente conectado) y capturar la dirección desde la que se enviaron los datos.

Esta función es la misma que CAsyncSocket::ReceiveFrom, salvo que controla las direcciones IPv6, así como los protocolos más antiguos.

En el caso de los sockets de tipo SOCK_STREAM, se devuelve tanta información como haya disponible actualmente, hasta el tamaño del búfer proporcionado. Si el socket se ha configurado para la recepción en línea de datos fuera de banda (opción de socket SO_OOBINLINE) y los datos fuera de banda están sin leer, solo se devolverán datos fuera de banda. La aplicación puede usar la opción IOCtlSIOCATMARK u OnOutOfBandData para determinar si quedan más datos fuera de banda sin leer. Los parámetros lpSockAddr y lpSockAddrLen se omiten en los sockets SOCK_STREAM.

En los sockets de datagrama, los datos se extraen del primer datagrama en cola, hasta el tamaño del búfer proporcionado. Si el datagrama es mayor que el búfer proporcionado, el búfer se rellena con la primera parte del mensaje, el exceso de datos se pierde y ReceiveFromEx devuelve un valor de SOCKET_ERROR con el código de error establecido en WSAEMSGSIZE.

Si lpSockAddr es distinto de cero y el socket es de tipo SOCK_DGRAM, la dirección de red del socket que envió los datos se copia en la estructura SOCKADDR correspondiente. El valor al que lpSockAddrLen apunta se inicializa en el tamaño de esta estructura y se modifica en la devolución para indicar el tamaño real de la dirección allí almacenada. Si no hay datos entrantes disponibles en el socket, la llamada a ReceiveFromEx espera a que lleguen datos, a menos que el socket sea de no bloqueo. En tal caso, se devuelve un valor de SOCKET_ERROR con el código de error establecido en WSAEWOULDBLOCK. La devolución de llamada OnReceive se puede usar para determinar cuándo van a llegar más datos.

Si el socket es de tipo SOCK_STREAM y el lado remoto ha apagado correctamente la conexión, una operación ReceiveFromEx se completará inmediatamente con 0 bytes recibidos.

CAsyncSocket::Send

Llame a esta función miembro para enviar datos en un socket conectado.

virtual int Send(
    const void* lpBuf,
    int nBufLen,
    int nFlags = 0);

Parámetros

lpBuf
Búfer que contiene los datos que se van a transmitir.

nBufLen
La longitud de los datos en lpBuf, en bytes.

nFlags
Especifica la forma en que se realiza la llamada. La semántica de esta función viene determinada por las opciones de socket y el parámetro nFlags. Este último se construye combinando cualquiera de los siguientes valores con el operador OR bit a bit de C++ (|):

  • MSG_DONTROUTE Especifica que los datos no deben estar sujetos a enrutamiento. Un proveedor de Windows Sockets puede optar por omitir esta marca.

  • MSG_OOB Envía datos fuera de banda (SOCK_STREAM solo).

Valor devuelto

Si no se produce ningún error, Send devuelve el número total de caracteres enviados (tenga en cuenta que esta cifra puede ser inferior al número indicado por nBufLen). De lo contrario, se devuelve un valor de SOCKET_ERROR, y se puede recuperar un código de error específico mediante una llamada a GetLastError. Los siguientes errores se aplican a esta función miembro:

  • WSANOTINITIALISEDAfxSocketInit debe producirse correctamente para poder usar esta API.

  • WSAENETDOWN La implementación de Windows Sockets ha detectado que se ha producido un error en el subsistema de red.

  • WSAEACCES La dirección solicitada es una dirección de difusión, pero no se ha establecido la marca adecuada.

  • WSAEINPROGRESS Hay una operación de Windows Sockets de bloqueo en curso.

  • WSAEFAULT El argumento lpBuf no está en una parte válida del espacio de direcciones del usuario.

  • WSAENETRESET La conexión debe restablecerse porque la implementación de Windows Sockets la ha quitado.

  • WSAENOBUFS La implementación de Windows Sockets informa de un interbloqueo de búfer.

  • WSAENOTCONN El socket no está conectado.

  • WSAENOTSOCK El descriptor no es un socket.

  • WSAEOPNOTSUPPMSG_OOB se ha especificado, pero el socket no es de tipo SOCK_STREAM.

  • WSAESHUTDOWN El socket está apagado; no es posible llamar a Send en un socket después de haber invocado a ShutDown con nHow establecido en 1 o 2.

  • WSAEWOULDBLOCK El socket está marcado como de no bloqueo y la operación solicitada supondría un bloqueo.

  • WSAEMSGSIZE El socket es de tipo SOCK_DGRAM y el datagrama es mayor que el máximo admitido por la implementación de Windows Sockets.

  • WSAEINVAL El socket no se ha enlazado a Bind.

  • WSAECONNABORTED El circuito virtual se ha anulado porque se ha agotado el tiempo de espera o debido a otro error.

  • WSAECONNRESET El lado remoto ha restablecido el circuito virtual.

Comentarios

Send se usa para escribir datos salientes en sockets de secuencias o de datagrama conectados. En los sockets de datagrama, hay que procurar no superar el tamaño máximo de paquete IP de las subredes subyacentes, tamaño que proporciona el elemento iMaxUdpDg de la estructura WSADATA devuelta por AfxSocketInit. Si los datos son demasiado largos para pasarlos de forma atómica a través del protocolo subyacente, se devuelve el error WSAEMSGSIZE a través de GetLastError y no se transmite ningún dato.

Tenga en cuenta que, en un socket de datagrama, la finalización correcta de un elemento Send no indica que los datos se hayan entregado correctamente.

En los objetos CAsyncSocket de tipo SOCK_STREAM, el número de bytes escritos puede estar comprendido entre 1 y la longitud solicitada, dependiendo de la disponibilidad del búfer en el host local y el host externo.

Ejemplo

Vea el ejemplo de CAsyncSocket::OnSend.

CAsyncSocket::SendTo

Llame a esta función miembro para enviar datos a un destino específico.

int SendTo(
    const void* lpBuf,
    int nBufLen,
    UINT nHostPort,
    LPCTSTR lpszHostAddress = NULL,
    int nFlags = 0);

int SendTo(
    const void* lpBuf,
    int nBufLen,
    const SOCKADDR* lpSockAddr,
    int nSockAddrLen,
    int nFlags = 0);

Parámetros

lpBuf
Búfer que contiene los datos que se van a transmitir.

nBufLen
La longitud de los datos en lpBuf, en bytes.

nHostPort
Puerto que identifica la aplicación de socket.

lpszHostAddress
Dirección de red del socket al que está conectado este objeto: puede ser un nombre de equipo, como "ftp.microsoft.com", o números separados por puntos, como "128.56.22.8".

nFlags
Especifica la forma en que se realiza la llamada. La semántica de esta función viene determinada por las opciones de socket y el parámetro nFlags. Este último se construye combinando cualquiera de los siguientes valores con el operador OR bit a bit de C++ (|):

  • MSG_DONTROUTE Especifica que los datos no deben estar sujetos a enrutamiento. Un proveedor de Windows Sockets puede optar por omitir esta marca.

  • MSG_OOB Envía datos fuera de banda (SOCK_STREAM solo).

lpSockAddr
Puntero a una estructura SOCKADDR que contiene la dirección del socket de destino.

nSockAddrLen
Longitud de la dirección en lpSockAddr, en bytes.

Valor devuelto

Si no se produce ningún error, SendTo devuelve el número total de caracteres enviados (tenga en cuenta que esta cifra puede ser inferior al número indicado por nBufLen). De lo contrario, se devuelve un valor de SOCKET_ERROR, y se puede recuperar un código de error específico mediante una llamada a GetLastError. Los siguientes errores se aplican a esta función miembro:

  • WSANOTINITIALISEDAfxSocketInit debe producirse correctamente para poder usar esta API.

  • WSAENETDOWN La implementación de Windows Sockets ha detectado que se ha producido un error en el subsistema de red.

  • WSAEACCES La dirección solicitada es una dirección de difusión, pero no se ha establecido la marca adecuada.

  • WSAEINPROGRESS Hay una operación de Windows Sockets de bloqueo en curso.

  • WSAEFAULT Los parámetros lpBuf o lpSockAddr no forman parte del espacio de direcciones del usuario, o bien el argumento lpSockAddr es demasiado pequeño (menor que el tamaño de una estructura SOCKADDR).

  • WSAEINVAL El nombre de host no es válido.

  • WSAENETRESET La conexión debe restablecerse porque la implementación de Windows Sockets la ha quitado.

  • WSAENOBUFS La implementación de Windows Sockets informa de un interbloqueo de búfer.

  • WSAENOTCONN El socket no está conectado (solo SOCK_STREAM).

  • WSAENOTSOCK El descriptor no es un socket.

  • WSAEOPNOTSUPPMSG_OOB se ha especificado, pero el socket no es de tipo SOCK_STREAM.

  • WSAESHUTDOWN El socket está apagado; no es posible llamar a SendTo en un socket después de haber invocado a ShutDown con nHow establecido en 1 o 2.

  • WSAEWOULDBLOCK El socket está marcado como de no bloqueo y la operación solicitada supondría un bloqueo.

  • WSAEMSGSIZE El socket es de tipo SOCK_DGRAM y el datagrama es mayor que el máximo admitido por la implementación de Windows Sockets.

  • WSAECONNABORTED El circuito virtual se ha anulado porque se ha agotado el tiempo de espera o debido a otro error.

  • WSAECONNRESET El lado remoto ha restablecido el circuito virtual.

  • WSAEADDRNOTAVAIL La dirección especificada no está disponible en el equipo local.

  • WSAEAFNOSUPPORT Las direcciones de la familia especificada no se pueden usar con este socket.

  • WSAEDESTADDRREQ Se requiere una dirección de destino.

  • WSAENETUNREACH No se puede acceder a la red desde este host en estos momentos.

Comentarios

SendTo se usa en sockets de secuencias o de datagrama, y sirve para escribir datos salientes en un socket. En los sockets de datagrama, hay que procurar no superar el tamaño máximo de paquete IP de las subredes subyacentes, tamaño que proporciona el elemento iMaxUdpDg de la estructura WSADATA rellenada por AfxSocketInit. Si los datos son demasiado largos para pasarlos de forma atómica a través del protocolo subyacente, se devuelve el error WSAEMSGSIZE y no se transmite ningún dato.

Tenga en cuenta que la finalización correcta de un elemento SendTo no indica que los datos se hayan entregado correctamente.

SendTo solo se usa en un socket SOCK_DGRAM para enviar un datagrama a un socket específico identificado por el parámetro lpSockAddr.

Para enviar una difusión (solo en SOCK_DGRAM), la dirección del parámetro lpSockAddr debe construirse usando la dirección IP especial INADDR_BROADCAST (definida en el archivo de encabezado de Windows Sockets WINSOCK.H) junto con el número de puerto previsto. O bien, si el parámetro lpszHostAddress es NULL, el socket está configurado para la difusión. Por lo general, se desaconseja que un datagrama de difusión supere el tamaño en el que pueda producirse una fragmentación, lo que implica que la parte de datos del datagrama (excluyendo los encabezados) no debe superar los 512 bytes.

Para controlar las direcciones IPv6, use CAsyncSocket::SendToEx.

CAsyncSocket::SendToEx

Llame a esta función miembro para enviar datos a un destino específico (controla las direcciones IPv6).

int SendToEx(
    const void* lpBuf,
    int nBufLen,
    UINT nHostPort,
    LPCTSTR lpszHostAddress = NULL,
    int nFlags = 0);

Parámetros

lpBuf
Búfer que contiene los datos que se van a transmitir.

nBufLen
La longitud de los datos en lpBuf, en bytes.

nHostPort
Puerto que identifica la aplicación de socket.

lpszHostAddress
Dirección de red del socket al que está conectado este objeto: puede ser un nombre de equipo, como "ftp.microsoft.com", o números separados por puntos, como "128.56.22.8".

nFlags
Especifica la forma en que se realiza la llamada. La semántica de esta función viene determinada por las opciones de socket y el parámetro nFlags. Este último se construye combinando cualquiera de los siguientes valores con el operador OR bit a bit de C++ (|):

  • MSG_DONTROUTE Especifica que los datos no deben estar sujetos a enrutamiento. Un proveedor de Windows Sockets puede optar por omitir esta marca.

  • MSG_OOB Envía datos fuera de banda (SOCK_STREAM solo).

Valor devuelto

Si no se produce ningún error, SendToEx devuelve el número total de caracteres enviados (tenga en cuenta que esta cifra puede ser inferior al número indicado por nBufLen). De lo contrario, se devuelve un valor de SOCKET_ERROR, y se puede recuperar un código de error específico mediante una llamada a GetLastError. Los siguientes errores se aplican a esta función miembro:

  • WSANOTINITIALISEDAfxSocketInit debe producirse correctamente para poder usar esta API.

  • WSAENETDOWN La implementación de Windows Sockets ha detectado que se ha producido un error en el subsistema de red.

  • WSAEACCES La dirección solicitada es una dirección de difusión, pero no se ha establecido la marca adecuada.

  • WSAEINPROGRESS Hay una operación de Windows Sockets de bloqueo en curso.

  • WSAEFAULT Los parámetros lpBuf o lpSockAddr no forman parte del espacio de direcciones del usuario, o bien el argumento lpSockAddr es demasiado pequeño (menor que el tamaño de una estructura SOCKADDR).

  • WSAEINVAL El nombre de host no es válido.

  • WSAENETRESET La conexión debe restablecerse porque la implementación de Windows Sockets la ha quitado.

  • WSAENOBUFS La implementación de Windows Sockets informa de un interbloqueo de búfer.

  • WSAENOTCONN El socket no está conectado (solo SOCK_STREAM).

  • WSAENOTSOCK El descriptor no es un socket.

  • WSAEOPNOTSUPPMSG_OOB se ha especificado, pero el socket no es de tipo SOCK_STREAM.

  • WSAESHUTDOWN El socket está apagado; no es posible llamar a SendToEx en un socket después de haber invocado a ShutDown con nHow establecido en 1 o 2.

  • WSAEWOULDBLOCK El socket está marcado como de no bloqueo y la operación solicitada supondría un bloqueo.

  • WSAEMSGSIZE El socket es de tipo SOCK_DGRAM y el datagrama es mayor que el máximo admitido por la implementación de Windows Sockets.

  • WSAECONNABORTED El circuito virtual se ha anulado porque se ha agotado el tiempo de espera o debido a otro error.

  • WSAECONNRESET El lado remoto ha restablecido el circuito virtual.

  • WSAEADDRNOTAVAIL La dirección especificada no está disponible en el equipo local.

  • WSAEAFNOSUPPORT Las direcciones de la familia especificada no se pueden usar con este socket.

  • WSAEDESTADDRREQ Se requiere una dirección de destino.

  • WSAENETUNREACH No se puede acceder a la red desde este host en estos momentos.

Comentarios

Este método es el mismo que CAsyncSocket::SendTo, salvo que controla las direcciones IPv6, así como los protocolos más antiguos.

SendToEx se usa en sockets de secuencias o de datagrama, y sirve para escribir datos salientes en un socket. En los sockets de datagrama, hay que procurar no superar el tamaño máximo de paquete IP de las subredes subyacentes, tamaño que proporciona el elemento iMaxUdpDg de la estructura WSADATA rellenada por AfxSocketInit. Si los datos son demasiado largos para pasarlos de forma atómica a través del protocolo subyacente, se devuelve el error WSAEMSGSIZE y no se transmite ningún dato.

Tenga en cuenta que la finalización correcta de un elemento SendToEx no indica que los datos se hayan entregado correctamente.

SendToEx solo se usa en un socket SOCK_DGRAM para enviar un datagrama a un socket específico identificado por el parámetro lpSockAddr.

Para enviar una difusión (solo en SOCK_DGRAM), la dirección del parámetro lpSockAddr debe construirse usando la dirección IP especial INADDR_BROADCAST (definida en el archivo de encabezado de Windows Sockets WINSOCK.H) junto con el número de puerto previsto. O bien, si el parámetro lpszHostAddress es NULL, el socket está configurado para la difusión. Por lo general, se desaconseja que un datagrama de difusión supere el tamaño en el que pueda producirse una fragmentación, lo que implica que la parte de datos del datagrama (excluyendo los encabezados) no debe superar los 512 bytes.

CAsyncSocket::SetSockOpt

Llame a esta función miembro para establecer una opción de socket.

BOOL SetSockOpt(
    int nOptionName,
    const void* lpOptionValue,
    int nOptionLen,
    int nLevel = SOL_SOCKET);

Parámetros

nOptionName
Opción de socket para la que se va a establecer el valor.

lpOptionValue
Puntero al búfer en el que se va a proporcionar el valor de la opción solicitada.

nOptionLen
El tamaño del búfer lpOptionValue, en bytes.

nLevel
Nivel en el que se define la opción; los únicos niveles admitidos son SOL_SOCKET y IPPROTO_TCP.

Valor devuelto

Distinto de cero si la función es correcta; de lo contrario, 0. Además, se puede recuperar un código de error específico mediante una llamada a GetLastError. Los siguientes errores se aplican a esta función miembro:

  • WSANOTINITIALISEDAfxSocketInit debe producirse correctamente para poder usar esta API.

  • WSAENETDOWN La implementación de Windows Sockets ha detectado que se ha producido un error en el subsistema de red.

  • WSAEFAULTlpOptionValue no está en una parte válida del espacio de direcciones del proceso.

  • WSAEINPROGRESS Hay una operación de Windows Sockets de bloqueo en curso.

  • WSAEINVALnLevel no es válido o la información de lpOptionValue no es válida.

  • WSAENETRESET La conexión agota el tiempo de espera cuando SO_KEEPALIVE se establece.

  • WSAENOPROTOOPT La opción es desconocida o no se admite. En concreto, SO_BROADCAST no se admite en sockets de tipo SOCK_STREAM, mientras que SO_DONTLINGER, SO_KEEPALIVE, SO_LINGER y SO_OOBINLINE no se admiten en sockets de tipo SOCK_DGRAM.

  • WSAENOTCONN La conexión se restablece cuando SO_KEEPALIVE se establece.

  • WSAENOTSOCK El descriptor no es un socket.

Comentarios

SetSockOpt establece el valor actual de una opción de socket asociada a un socket de cualquier tipo y en cualquier estado. Aunque las opciones pueden estar en varios niveles de protocolo, esta especificación solo define las opciones que están en el nivel de "socket" superior. Las opciones afectan a las operaciones de socket, como si se van a recibir datos inmediatos en el flujo de datos normal, si se van a poder enviar mensajes de difusión en el socket, etc.

Hay dos tipos de opciones de socket: opciones booleanas, que habilitan o deshabilitan una característica o un comportamiento, y opciones que requieren un valor o una estructura de enteros. Para habilitar una opción booleana, lpOptionValue apunta a un entero distinto de cero. Para deshabilitarla, lpOptionValue apunta a un entero igual a cero. nOptionLen debe ser igual a sizeof(BOOL) en las opciones booleanas. En otras opciones, lpOptionValue apunta al entero o a la estructura que contiene el valor deseado en la opción, y nOptionLen es la longitud del entero o la estructura en cuestión.

SO_LINGER controla la acción realizada cuando los datos sin enviar se ponen en cola en un socket y se llama a la función Close para cerrar el socket.

De forma predeterminada, un socket no se puede enlazar (vea Bind) a una dirección local que ya está en uso. Sin embargo, en ocasiones puede ser conveniente "reutilizar" una dirección de esta manera. Puesto que cada conexión se identifica de forma única mediante la combinación de direcciones locales y remotas, no hay ningún problema si se tienen dos sockets enlazados a la misma dirección local, siempre que las direcciones remotas sean diferentes.

Para informar a la implementación de Windows Sockets de que no se debe permitir una llamada a Bind en un socket cuando se quiera utilizar una dirección que ya esté en uso, la aplicación debe establecer la opción de socket SO_REUSEADDR del socket antes de emitir la llamada a Bind. Tenga en cuenta que la opción solo se interpreta en el momento de la llamada a Bind: por lo tanto, es innecesario (a la par que irrelevante) establecer la opción en un socket que no se va a enlazar a una dirección existente, y establecer o restablecer la opción después de la llamada a Bind no tiene efecto alguno en este o en cualquier otro socket.

Una aplicación puede solicitar que la implementación de Windows Sockets permita el uso de paquetes de mantenimiento de conexiones abiertas en las conexiones del Protocolo de control de transmisión (TCP), activando para ello la opción de socket SO_KEEPALIVE. Una implementación de Windows Sockets no necesita admitir el uso de mantenimiento de conexiones abiertas: si lo hace, la semántica precisa es específica de la implementación, pero debe cumplir la sección 4.2.3.6 de RFC 1122 relativa a los requisitos de los hosts de Internet (capas de comunicación). Si una conexión se descarta como consecuencia del mantenimiento de una conexión abierta, se devuelve el código de error WSAENETRESET en cualquier llamada que haya en curso en el socket, y se producirá el error WSAENOTCONN en las llamadas posteriores.

La opción TCP_NODELAY deshabilita el algoritmo de Nagle. El algoritmo de Nagle se usa para reducir el número de paquetes pequeños enviados por un host, para lo cual almacena en búfer los datos de envío sin confirmar hasta que se pueda enviar un paquete de tamaño completo. Sin embargo, este algoritmo puede perjudicar el rendimiento de algunas aplicaciones; para desactivarlo, se puede usar TCP_NODELAY. Los escritores de aplicaciones no deben establecer TCP_NODELAY a menos que sean perfectamente conscientes de las repercusiones, ya que establecer TCP_NODELAY puede tener un impacto adverso muy significativo en el rendimiento de la red. TCP_NODELAY es la única opción de socket compatible que usa el nivel IPPROTO_TCP; todas las demás opciones usan el nivel SOL_SOCKET.

Algunas implementaciones de Windows Sockets proporcionan información de depuración de salida si una aplicación establece la opción SO_DEBUG.

En SetSockOpt se admiten las siguientes opciones. La columna Tipo refleja el tipo de datos tratado por lpOptionValue.

Valor Tipo Significado
SO_BROADCAST BOOL Permite la transmisión de mensajes de difusión en el socket.
SO_DEBUG BOOL Registra información de depuración.
SO_DONTLINGER BOOL Close no se bloquea mientras se espera a que se envíen datos no enviados. Establecer esta opción equivale a establecer SO_LINGER con l_onoff establecido en cero.
SO_DONTROUTE BOOL No enruta: envía directamente a la interfaz.
SO_KEEPALIVE BOOL Se envía el mantenimiento de conexiones abiertas.
SO_LINGER struct LINGER Close se demora si existen datos no enviados.
SO_OOBINLINE BOOL Recibe datos fuera de banda en el flujo de datos normal.
SO_RCVBUF int Especifica el tamaño del búfer de recepciones.
SO_REUSEADDR BOOL Permite enlazar el socket a una dirección que ya está en uso (vea Bind).
SO_SNDBUF int Especifica el tamaño del búfer de envíos.
TCP_NODELAY BOOL Deshabilita el algoritmo de Nagle para la fusión de envíos.

Estas son las opciones de Berkeley Software Distribution (BSD) que no se admiten con SetSockOpt:

Valor Tipo Significado
SO_ACCEPTCONN BOOL El socket se encuentra a la escucha.
SO_ERROR int Obtiene el estado de error y lo borra.
SO_RCVLOWAT int Marca de agua mínima de recepción.
SO_RCVTIMEO int Tiempo de espera de recepción
SO_SNDLOWAT int Marca de agua mínima de envío.
SO_SNDTIMEO int Tiempo de espera de envío.
SO_TYPE int Tipo del socket.
IP_OPTIONS Establece el campo de opciones en el encabezado IP.

CAsyncSocket::ShutDown

Llame a esta función miembro para deshabilitar los envíos, las recepciones, o ambos, en el socket.

BOOL ShutDown(int nHow = sends);

Parámetros

nHow
Marca que describe qué tipos de operaciones ya no se van a permitir, con los siguientes valores:

  • recepciones = 0

  • envíos = 1

  • ambod = 2

Valor devuelto

Distinto de cero si la función es correcta; de lo contrario, 0. Además, se puede recuperar un código de error específico mediante una llamada a GetLastError. Los siguientes errores se aplican a esta función miembro:

  • WSANOTINITIALISEDAfxSocketInit debe producirse correctamente para poder usar esta API.

  • WSAENETDOWN La implementación de Windows Sockets ha detectado que se ha producido un error en el subsistema de red.

  • WSAEINVALnHow no es válido.

  • WSAEINPROGRESS Hay una operación de Windows Sockets de bloqueo en curso.

  • WSAENOTCONN El socket no está conectado (solo SOCK_STREAM).

  • WSAENOTSOCK El descriptor no es un socket.

Comentarios

ShutDown se usa en todos los tipos de sockets para deshabilitar la recepción, la transmisión o ambos. Si nHow es 0, no se permitirán las recepciones posteriores en el socket. Esto no tiene ningún efecto en las capas de protocolo inferiores.

En el Protocolo de control de transmisión (TCP), la ventana TCP no cambia y se aceptarán datos entrantes (pero sin confirmar) hasta que la ventana se agote. En el Protocolo de datagramas de usuario (UDP), los datagramas entrantes se aceptan y se ponen en cola. En ningún caso se generará un paquete de error ICMP. Si nHow es 1, no se permiten los envíos posteriores. En los sockets TCP, se enviará una marca FIN. Si nHow se establece en 2, se deshabilitan tanto los envíos como las recepciones del modo descrito anteriormente.

Tenga en cuenta que ShutDown no cierra el socket, y los recursos asociados al socket no se liberarán hasta que se llame a Close. Una aplicación no debe depender de poder reutilizar un socket después de que este se haya apagado. En concreto, una implementación de Windows Sockets no es necesaria para admitir el uso de Connect en este socket.

Ejemplo

Vea el ejemplo de CAsyncSocket::OnReceive.

CASyncSocket::Socket

Asigna un identificador de socket.

BOOL Socket(
    int nSocketType = SOCK_STREAM,
    long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE,
    int nProtocolType = 0,
    int nAddressFormat = PF_INET);

Parámetros

nSocketType
Especifica SOCK_STREAM o SOCK_DGRAM.

lEvent
Máscara de bits que especifica una combinación de eventos de red en los que la aplicación está interesada.

  • FD_READ: se quiere recibir una notificación de preparación de lectura.

  • FD_WRITE: se quiere recibir una notificación de preparación de escritura.

  • FD_OOB: se quiere recibir una notificación cuando lleguen datos fuera de banda.

  • FD_ACCEPT: se quiere recibir una notificación de las conexiones entrantes.

  • FD_CONNECT: se quiere recibir una notificación de conexión completada.

  • FD_CLOSE: se quiere recibir una notificación de cierre de socket.

nProtocolType
Protocolo que se va a usar con el socket específico de la familia de direcciones indicada.

nAddressFormat
Especificación de la familia de direcciones.

Valor devuelto

Devuelve TRUE si la operación se realiza correctamente; de lo contrario, devuelve FALSE.

Comentarios

Este método asigna un identificador de socket. No llama a CAsyncSocket::Bind para enlazar el socket a una dirección especificada, por lo que hay que llamar a Bind más adelante para enlazar el socket a una dirección especificada. Puede usar CAsyncSocket::SetSockOpt para establecer la opción de socket antes de enlazarlo.

Consulte también

CObject (clase)
Gráfico de jerarquías
CSocket (clase)
CSocketFile (clase)