Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Clase
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
CAsyncSocket
Requisitos
Encabezado: afxsock.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:
WSANOTINITIALISEDAfxSocketInitdebe producirse correctamente para poder usar esta API.WSAENETDOWNLa implementación de Windows Sockets ha detectado que se ha producido un error en el subsistema de red.WSAEFAULTEl argumentolpSockAddrLenes demasiado pequeño (inferior al tamaño de una estructuraSOCKADDR).WSAEINPROGRESSHay una llamada de Windows Sockets de bloqueo en curso.WSAEINVALListenno se invocó antes de aceptar.WSAEMFILELa cola está vacía al entrar para aceptar y no hay descriptores disponibles.WSAENOBUFSNo hay espacio disponible en el búfer.WSAENOTSOCKEl descriptor no es un socket.WSAEOPNOTSUPPEl socket al que se hace referencia no es un tipo que admite el servicio orientado a la conexión.WSAEWOULDBLOCKEl 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_READSe quiere recibir una notificación de preparación de lectura.FD_WRITESe quiere recibir una notificación cuando haya datos disponibles para leerse.FD_OOBSe quiere recibir una notificación cuando lleguen datos fuera de banda.FD_ACCEPTSe quiere recibir una notificación de las conexiones entrantes.FD_CONNECTSe quiere recibir una notificación de los resultados de la conexión.FD_CLOSESe 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:
WSANOTINITIALISEDAfxSocketInitdebe producirse correctamente para poder usar esta API.WSAENETDOWNLa implementación de Windows Sockets ha detectado que se ha producido un error en el subsistema de red.WSAEINVALIndica que uno de los parámetros especificados no era válido.WSAEINPROGRESSHay 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_READSe quiere recibir una notificación de preparación de lectura.FD_WRITESe quiere recibir una notificación cuando haya datos disponibles para leerse.FD_OOBSe quiere recibir una notificación cuando lleguen datos fuera de banda.FD_ACCEPTSe quiere recibir una notificación de las conexiones entrantes.FD_CONNECTSe quiere recibir una notificación de los resultados de la conexión.FD_CLOSESe 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.
WSANOTINITIALISEDAfxSocketInitdebe producirse correctamente para poder usar esta API.WSAENETDOWNLa implementación de Windows Sockets ha detectado que se ha producido un error en el subsistema de red.WSAEADDRINUSELa dirección especificada ya está en uso (vea la opción de socketSO_REUSEADDRenSetSockOpt).WSAEFAULTEl argumentonSockAddrLenes demasiado pequeño (inferior al tamaño de una estructuraSOCKADDR).WSAEINPROGRESSHay una llamada de Windows Sockets de bloqueo en curso.WSAEAFNOSUPPORTEste puerto no admite la familia de direcciones especificada.WSAEINVALEl socket ya está enlazado a una dirección.WSAENOBUFSNo hay suficientes búferes disponibles; demasiadas conexiones.WSAENOTSOCKEl 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:
WSANOTINITIALISEDAfxSocketInitdebe producirse correctamente para poder usar esta API.WSAENETDOWNLa implementación de Windows Sockets ha detectado que se ha producido un error en el subsistema de red.WSAEADDRINUSELa dirección especificada ya está en usoWSAEINPROGRESSHay una llamada de Windows Sockets de bloqueo en curso.WSAEADDRNOTAVAILLa dirección especificada no está disponible en el equipo local.WSAEAFNOSUPPORTLas direcciones de la familia especificada no se pueden usar con este socket.WSAECONNREFUSEDEl intento de conexión se rechazó.WSAEDESTADDRREQSe requiere una dirección de destino.WSAEFAULTEl argumentonSockAddrLenes incorrecto.WSAEINVALDirección de host no válida.WSAEISCONNEl socket ya está conectado.WSAEMFILENo hay más descriptores de archivo disponibles.WSAENETUNREACHNo se puede acceder a la red desde este host en estos momentos.WSAENOBUFSNo hay espacio disponible en el búfer. El socket no se puede conectar.WSAENOTSOCKEl descriptor no es un socket.WSAETIMEDOUTSe ha agotado el tiempo de espera de la conexión sin poder establecer una conexión.WSAEWOULDBLOCKEl 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_READSe quiere recibir una notificación de preparación de lectura.FD_WRITESe quiere recibir una notificación de preparación de escritura.FD_OOBSe quiere recibir una notificación cuando lleguen datos fuera de banda.FD_ACCEPTSe quiere recibir una notificación de las conexiones entrantes.FD_CONNECTSe quiere recibir una notificación de conexión completada.FD_CLOSESe 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:
WSANOTINITIALISEDAfxSocketInitdebe producirse correctamente para poder usar esta API.WSAENETDOWNLa implementación de Windows Sockets ha detectado que se ha producido un error en el subsistema de red.WSAEAFNOSUPPORTLa familia de direcciones especificada no se admite.WSAEINPROGRESSHay una operación de Windows Sockets de bloqueo en curso.WSAEMFILENo hay más descriptores de archivo disponibles.WSAENOBUFSNo hay espacio disponible en el búfer. El socket no se puede crear.WSAEPROTONOSUPPORTEl puerto especificado no se admite.WSAEPROTOTYPEEl puerto especificado es de un tipo incorrecto para este socket.WSAESOCKTNOSUPPORTEl 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_STREAMProporciona 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_DGRAMAdmite 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
Accepttoma una referencia a un objetoCSocketnuevo y vacío como parámetro. Debe construir este objeto antes de llamar aAccept. Tenga en cuenta que si este objeto de socket se sale del ámbito, la conexión se cierra. No llame aCreatepara este nuevo objeto de socket.
Importante
Create
no 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_READSe quiere recibir una notificación de preparación de lectura.FD_WRITESe quiere recibir una notificación de preparación de escritura.FD_OOBSe quiere recibir una notificación cuando lleguen datos fuera de banda.FD_ACCEPTSe quiere recibir una notificación de las conexiones entrantes.FD_CONNECTSe quiere recibir una notificación de conexión completada.FD_CLOSESe 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:
WSANOTINITIALISEDAfxSocketInitdebe producirse correctamente para poder usar esta API.WSAENETDOWNLa implementación de Windows Sockets ha detectado que se ha producido un error en el subsistema de red.WSAEFAULTEl argumentolpSockAddrLenno es lo suficientemente grande.WSAEINPROGRESSHay una llamada de Windows Sockets de bloqueo en curso.WSAENOTCONNEl socket no está conectado.WSAENOTSOCKEl 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:
WSANOTINITIALISEDAfxSocketInitdebe producirse correctamente para poder usar esta API.WSAENETDOWNLa implementación de Windows Sockets ha detectado que se ha producido un error en el subsistema de red.WSAEFAULTEl argumentolpSockAddrLenno es lo suficientemente grande.WSAEINPROGRESSHay una llamada de Windows Sockets de bloqueo en curso.WSAENOTCONNEl socket no está conectado.WSAENOTSOCKEl 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:
WSANOTINITIALISEDAfxSocketInitdebe producirse correctamente para poder usar esta API.WSAENETDOWNLa implementación de Windows Sockets ha detectado que se ha producido un error en el subsistema de red.WSAEFAULTEl argumentolpSockAddrLenno es lo suficientemente grande.WSAEINPROGRESSHay una operación de Windows Sockets de bloqueo en curso.WSAENOTSOCKEl descriptor no es un socket.WSAEINVALEl socket no se ha enlazado a una dirección conBind.
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:
WSANOTINITIALISEDAfxSocketInitdebe producirse correctamente para poder usar esta API.WSAENETDOWNLa implementación de Windows Sockets ha detectado que se ha producido un error en el subsistema de red.WSAEFAULTEl argumentolpSockAddrLenno es lo suficientemente grande.WSAEINPROGRESSHay una operación de Windows Sockets de bloqueo en curso.WSAENOTSOCKEl descriptor no es un socket.WSAEINVALEl socket no se ha enlazado a una dirección conBind.
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:
WSANOTINITIALISEDAfxSocketInitdebe producirse correctamente para poder usar esta API.WSAENETDOWNLa implementación de Windows Sockets ha detectado que se ha producido un error en el subsistema de red.WSAEFAULTEl argumentolpOptionLenno era válido.WSAEINPROGRESSHay una operación de Windows Sockets de bloqueo en curso.WSAENOPROTOOPTLa opción es desconocida o no se admite. En concreto,SO_BROADCASTno se admite en sockets de tipoSOCK_STREAM, mientras queSO_ACCEPTCONN,SO_DONTLINGER,SO_KEEPALIVE,SO_LINGERySO_OOBINLINEno se admiten en sockets de tipoSOCK_DGRAM.WSAENOTSOCKEl 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:
WSANOTINITIALISEDAfxSocketInitdebe producirse correctamente para poder usar esta API.WSAENETDOWNLa implementación de Windows Sockets ha detectado que se ha producido un error en el subsistema de red.WSAEINVALlCommandno es un comando válido olpArgumentno es un parámetro aceptable paralCommando el comando no es aplicable al tipo de socket proporcionado.WSAEINPROGRESSHay una operación de Windows Sockets de bloqueo en curso.WSAENOTSOCKEl 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:
FIONBIOHabilite o deshabilite el modo de no bloqueo en el socket. El parámetrolpArgumentapunta a un valorDWORD, que es distinto de cero si el modo de no bloqueo se va a habilitar y cero si se va a deshabilitar. SiAsyncSelectse ha emitido en un socket, cualquier intento de usarIOCtlpara volver a establecer el socket en modo de bloqueo producirá un error enWSAEINVAL. Para volver a establecer el socket en el modo de bloqueo y soslayar el errorWSAEINVAL, primero una aplicación debe deshabilitarAsyncSelectmediante una llamada aAsyncSelectcon el parámetrolEventigual a 0 y, a continuación, llamar aIOCtl.FIONREADDetermine el número máximo de bytes que se pueden leer con una llamada aReceivedesde este socket. El parámetrolpArgumentapunta a un valorDWORDen el queIOCtlalmacena el resultado. Si este socket es de tipoSOCK_STREAM,FIONREADdevuelve la cantidad total de datos que se pueden leer en un solo objetoReceive; suele equivaler a la cantidad total de datos en cola en el socket. Si este socket es de tipoSOCK_DGRAM,FIONREADdevuelve el tamaño del primer datagrama en cola en el socket.SIOCATMARKDetermine si se han leído todos los datos fuera de banda. Esto solo se aplica a un socket de tipoSOCK_STREAMque se ha configurado para la recepción en línea de cualquier dato 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ónReceiveoReceiveFromrealizada en el socket recuperará algunos o todos los datos anteriores a la "marca"; la aplicación debe usar la operaciónSIOCATMARKpara 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ónReceiveoReceiveFromnunca se mezclarán datos fuera de banda y datos normales en una misma llamada). El parámetrolpArgumentapunta a un valorDWORDen el queIOCtlalmacena 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:
WSANOTINITIALISEDAfxSocketInitdebe producirse correctamente para poder usar esta API.WSAENETDOWNLa implementación de Windows Sockets ha detectado que se ha producido un error en el subsistema de red.WSAEADDRINUSESe ha intentado escuchar en una dirección que está en uso.WSAEINPROGRESSHay una operación de Windows Sockets de bloqueo en curso.WSAEINVALEl socket no se ha enlazado aBindo ya está conectado.WSAEISCONNEl socket ya está conectado.WSAEMFILENo hay más descriptores de archivo disponibles.WSAENOBUFSNo hay espacio disponible en el búfer.WSAENOTSOCKEl descriptor no es un socket.WSAEOPNOTSUPPEl socket al que se hace referencia no es de un tipo que admita la operaciónListen.
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.
WSAENETDOWNLa 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.
WSAENETDOWNLa implementación de Windows Sockets ha detectado que se ha producido un error en el subsistema de red.WSAECONNRESETEl 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.
WSAEADDRINUSELa dirección especificada ya está en usoWSAEADDRNOTAVAILLa dirección especificada no está disponible en el equipo local.WSAEAFNOSUPPORTLas direcciones de la familia especificada no se pueden usar con este socket.WSAECONNREFUSEDEl intento de conexión se ha rechazado a la fuerza.WSAEDESTADDRREQSe requiere una dirección de destino.WSAEFAULTEl argumentolpSockAddrLenes incorrecto.WSAEINVALEl socket ya está enlazado a una dirección.WSAEISCONNEl socket ya está conectado.WSAEMFILENo hay más descriptores de archivo disponibles.WSAENETUNREACHNo se puede acceder a la red desde este host en estos momentos.WSAENOBUFSNo hay espacio disponible en el búfer. El socket no se puede conectar.WSAENOTCONNEl socket no está conectado.WSAENOTSOCKEl descriptor es un archivo, no un socket.WSAETIMEDOUTSe 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.
WSAENETDOWNLa 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.
WSAENETDOWNLa 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.
WSAENETDOWNLa 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_PEEKInspecciona los datos entrantes. Los datos se copian en el búfer, pero no se quitan de la cola de entrada.MSG_OOBProcesa 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:
WSANOTINITIALISEDAfxSocketInitdebe producirse correctamente para poder usar esta API.WSAENETDOWNLa implementación de Windows Sockets ha detectado que se ha producido un error en el subsistema de red.WSAENOTCONNEl socket no está conectado.WSAEINPROGRESSHay una operación de Windows Sockets de bloqueo en curso.WSAENOTSOCKEl descriptor no es un socket.WSAEOPNOTSUPPMSG_OOBse especificó, pero el socket no es de tipoSOCK_STREAM.WSAESHUTDOWNEl socket está apagado; no es posible llamar aReceiveen un socket después de haber invocado aShutDownconnHowestablecido en 0 o 2.WSAEWOULDBLOCKEl socket está marcado como de no bloqueo y la operaciónReceivesupondría un bloqueo.WSAEMSGSIZEEl mensaje era demasiado grande para caber en el búfer especificado y se ha truncado.WSAEINVALEl socket no se ha enlazado aBind.WSAECONNABORTEDEl circuito virtual se ha anulado porque se ha agotado el tiempo de espera o debido a otro error.WSAECONNRESETEl 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_PEEKInspecciona los datos entrantes. Los datos se copian en el búfer, pero no se quitan de la cola de entrada.MSG_OOBProcesa 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:
WSANOTINITIALISEDAfxSocketInitdebe producirse correctamente para poder usar esta API.WSAENETDOWNLa implementación de Windows Sockets ha detectado que se ha producido un error en el subsistema de red.WSAEFAULTEl argumentolpSockAddrLenno era válido: el búferlpSockAddrera demasiado pequeño como para dar cabida a la dirección del mismo nivel.WSAEINPROGRESSHay una operación de Windows Sockets de bloqueo en curso.WSAEINVALEl socket no se ha enlazado aBind.WSAENOTCONNEl socket no está conectado (soloSOCK_STREAM).WSAENOTSOCKEl descriptor no es un socket.WSAEOPNOTSUPPMSG_OOBse especificó, pero el socket no es de tipoSOCK_STREAM.WSAESHUTDOWNEl socket está apagado; no es posible llamar aReceiveFromen un socket después de haber invocado aShutDownconnHowestablecido en 0 o 2.WSAEWOULDBLOCKEl socket está marcado como de no bloqueo y la operaciónReceiveFromsupondría un bloqueo.WSAEMSGSIZEEl mensaje era demasiado grande para caber en el búfer especificado y se ha truncado.WSAECONNABORTEDEl circuito virtual se ha anulado porque se ha agotado el tiempo de espera o debido a otro error.WSAECONNRESETEl 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_PEEKInspecciona los datos entrantes. Los datos se copian en el búfer, pero no se quitan de la cola de entrada.MSG_OOBProcesa 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:
WSANOTINITIALISEDAfxSocketInitdebe producirse correctamente para poder usar esta API.WSAENETDOWNLa implementación de Windows Sockets ha detectado que se ha producido un error en el subsistema de red.WSAEFAULTEl argumentolpSockAddrLenno era válido: el búferlpSockAddrera demasiado pequeño como para dar cabida a la dirección del mismo nivel.WSAEINPROGRESSHay una operación de Windows Sockets de bloqueo en curso.WSAEINVALEl socket no se ha enlazado aBind.WSAENOTCONNEl socket no está conectado (soloSOCK_STREAM).WSAENOTSOCKEl descriptor no es un socket.WSAEOPNOTSUPPMSG_OOBse especificó, pero el socket no es de tipoSOCK_STREAM.WSAESHUTDOWNEl socket está apagado; no es posible llamar aReceiveFromExen un socket después de haber invocado aShutDownconnHowestablecido en 0 o 2.WSAEWOULDBLOCKEl socket está marcado como de no bloqueo y la operaciónReceiveFromExsupondría un bloqueo.WSAEMSGSIZEEl mensaje era demasiado grande para caber en el búfer especificado y se ha truncado.WSAECONNABORTEDEl circuito virtual se ha anulado porque se ha agotado el tiempo de espera o debido a otro error.WSAECONNRESETEl 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_DONTROUTEEspecifica que los datos no deben estar sujetos a enrutamiento. Un proveedor de Windows Sockets puede optar por omitir esta marca.MSG_OOBEnvía datos fuera de banda (SOCK_STREAMsolo).
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:
WSANOTINITIALISEDAfxSocketInitdebe producirse correctamente para poder usar esta API.WSAENETDOWNLa implementación de Windows Sockets ha detectado que se ha producido un error en el subsistema de red.WSAEACCESLa dirección solicitada es una dirección de difusión, pero no se ha establecido la marca adecuada.WSAEINPROGRESSHay una operación de Windows Sockets de bloqueo en curso.WSAEFAULTEl argumentolpBufno está en una parte válida del espacio de direcciones del usuario.WSAENETRESETLa conexión debe restablecerse porque la implementación de Windows Sockets la ha quitado.WSAENOBUFSLa implementación de Windows Sockets informa de un interbloqueo de búfer.WSAENOTCONNEl socket no está conectado.WSAENOTSOCKEl descriptor no es un socket.WSAEOPNOTSUPPMSG_OOBse especificó, pero el socket no es de tipoSOCK_STREAM.WSAESHUTDOWNEl socket está apagado; no es posible llamar aSenden un socket después de haber invocado aShutDownconnHowestablecido en 1 o 2.WSAEWOULDBLOCKEl socket está marcado como de no bloqueo y la operación solicitada supondría un bloqueo.WSAEMSGSIZEEl socket es de tipoSOCK_DGRAMy el datagrama es mayor que el máximo admitido por la implementación de Windows Sockets.WSAEINVALEl socket no se ha enlazado aBind.WSAECONNABORTEDEl circuito virtual se ha anulado porque se ha agotado el tiempo de espera o debido a otro error.WSAECONNRESETEl 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_DONTROUTEEspecifica que los datos no deben estar sujetos a enrutamiento. Un proveedor de Windows Sockets puede optar por omitir esta marca.MSG_OOBEnvía datos fuera de banda (SOCK_STREAMsolo).
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:
WSANOTINITIALISEDAfxSocketInitdebe producirse correctamente para poder usar esta API.WSAENETDOWNLa implementación de Windows Sockets ha detectado que se ha producido un error en el subsistema de red.WSAEACCESLa dirección solicitada es una dirección de difusión, pero no se ha establecido la marca adecuada.WSAEINPROGRESSHay una operación de Windows Sockets de bloqueo en curso.WSAEFAULTLos parámetroslpBufolpSockAddrno forman parte del espacio de direcciones del usuario, o bien el argumentolpSockAddres demasiado pequeño (menor que el tamaño de una estructuraSOCKADDR).WSAEINVALEl nombre de host no es válido.WSAENETRESETLa conexión debe restablecerse porque la implementación de Windows Sockets la ha quitado.WSAENOBUFSLa implementación de Windows Sockets informa de un interbloqueo de búfer.WSAENOTCONNEl socket no está conectado (soloSOCK_STREAM).WSAENOTSOCKEl descriptor no es un socket.WSAEOPNOTSUPPMSG_OOBse especificó, pero el socket no es de tipoSOCK_STREAM.WSAESHUTDOWNEl socket está apagado; no es posible llamar aSendToen un socket después de haber invocado aShutDownconnHowestablecido en 1 o 2.WSAEWOULDBLOCKEl socket está marcado como de no bloqueo y la operación solicitada supondría un bloqueo.WSAEMSGSIZEEl socket es de tipoSOCK_DGRAMy el datagrama es mayor que el máximo admitido por la implementación de Windows Sockets.WSAECONNABORTEDEl circuito virtual se ha anulado porque se ha agotado el tiempo de espera o debido a otro error.WSAECONNRESETEl lado remoto ha restablecido el circuito virtual.WSAEADDRNOTAVAILLa dirección especificada no está disponible en el equipo local.WSAEAFNOSUPPORTLas direcciones de la familia especificada no se pueden usar con este socket.WSAEDESTADDRREQSe requiere una dirección de destino.WSAENETUNREACHNo 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_DONTROUTEEspecifica que los datos no deben estar sujetos a enrutamiento. Un proveedor de Windows Sockets puede optar por omitir esta marca.MSG_OOBEnvía datos fuera de banda (SOCK_STREAMsolo).
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:
WSANOTINITIALISEDAfxSocketInitdebe producirse correctamente para poder usar esta API.WSAENETDOWNLa implementación de Windows Sockets ha detectado que se ha producido un error en el subsistema de red.WSAEACCESLa dirección solicitada es una dirección de difusión, pero no se ha establecido la marca adecuada.WSAEINPROGRESSHay una operación de Windows Sockets de bloqueo en curso.WSAEFAULTLos parámetroslpBufolpSockAddrno forman parte del espacio de direcciones del usuario, o bien el argumentolpSockAddres demasiado pequeño (menor que el tamaño de una estructuraSOCKADDR).WSAEINVALEl nombre de host no es válido.WSAENETRESETLa conexión debe restablecerse porque la implementación de Windows Sockets la ha quitado.WSAENOBUFSLa implementación de Windows Sockets informa de un interbloqueo de búfer.WSAENOTCONNEl socket no está conectado (soloSOCK_STREAM).WSAENOTSOCKEl descriptor no es un socket.WSAEOPNOTSUPPMSG_OOBse especificó, pero el socket no es de tipoSOCK_STREAM.WSAESHUTDOWNEl socket está apagado; no es posible llamar aSendToExen un socket después de haber invocado aShutDownconnHowestablecido en 1 o 2.WSAEWOULDBLOCKEl socket está marcado como de no bloqueo y la operación solicitada supondría un bloqueo.WSAEMSGSIZEEl socket es de tipoSOCK_DGRAMy el datagrama es mayor que el máximo admitido por la implementación de Windows Sockets.WSAECONNABORTEDEl circuito virtual se ha anulado porque se ha agotado el tiempo de espera o debido a otro error.WSAECONNRESETEl lado remoto ha restablecido el circuito virtual.WSAEADDRNOTAVAILLa dirección especificada no está disponible en el equipo local.WSAEAFNOSUPPORTLas direcciones de la familia especificada no se pueden usar con este socket.WSAEDESTADDRREQSe requiere una dirección de destino.WSAENETUNREACHNo 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:
WSANOTINITIALISEDAfxSocketInitdebe producirse correctamente para poder usar esta API.WSAENETDOWNLa implementación de Windows Sockets ha detectado que se ha producido un error en el subsistema de red.WSAEFAULTlpOptionValueno está en una parte válida del espacio de direcciones del proceso.WSAEINPROGRESSHay una operación de Windows Sockets de bloqueo en curso.WSAEINVALnLevelno es válido o la información de nolpOptionValuees válida.WSAENETRESETLa conexión agota el tiempo de espera cuandoSO_KEEPALIVEse establece.WSAENOPROTOOPTLa opción es desconocida o no se admite. En concreto,SO_BROADCASTno se admite en sockets de tipoSOCK_STREAM, mientras queSO_DONTLINGER,SO_KEEPALIVE,SO_LINGERySO_OOBINLINEno se admiten en sockets de tipoSOCK_DGRAM.WSAENOTCONNLa conexión se restablece cuandoSO_KEEPALIVEse establece.WSAENOTSOCKEl 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:
WSANOTINITIALISEDAfxSocketInitdebe producirse correctamente para poder usar esta API.WSAENETDOWNLa implementación de Windows Sockets ha detectado que se ha producido un error en el subsistema de red.WSAEINVALnHowno es válido.WSAEINPROGRESSHay una operación de Windows Sockets de bloqueo en curso.WSAENOTCONNEl socket no está conectado (soloSOCK_STREAM).WSAENOTSOCKEl 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)