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
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:
WSANOTINITIALISED
AfxSocketInit
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 argumentolpSockAddrLen
es demasiado pequeño (inferior al tamaño de una estructuraSOCKADDR
).WSAEINPROGRESS
Hay una llamada de Windows Sockets de bloqueo en curso.WSAEINVAL
Listen
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:
WSANOTINITIALISED
AfxSocketInit
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.
WSANOTINITIALISED
AfxSocketInit
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 socketSO_REUSEADDR
enSetSockOpt
).WSAEFAULT
El argumentonSockAddrLen
es demasiado pequeño (inferior al tamaño de una estructuraSOCKADDR
).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:
WSANOTINITIALISED
AfxSocketInit
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 usoWSAEINPROGRESS
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 argumentonSockAddrLen
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:
WSANOTINITIALISED
AfxSocketInit
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 objetoCSocket
nuevo 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 aCreate
para 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_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:
WSANOTINITIALISED
AfxSocketInit
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 argumentolpSockAddrLen
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:
WSANOTINITIALISED
AfxSocketInit
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 argumentolpSockAddrLen
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:
WSANOTINITIALISED
AfxSocketInit
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 argumentolpSockAddrLen
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 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:
WSANOTINITIALISED
AfxSocketInit
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 argumentolpSockAddrLen
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 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:
WSANOTINITIALISED
AfxSocketInit
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 argumentolpOptionLen
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 tipoSOCK_STREAM
, mientras queSO_ACCEPTCONN
,SO_DONTLINGER
,SO_KEEPALIVE
,SO_LINGER
ySO_OOBINLINE
no se admiten en sockets de tipoSOCK_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:
WSANOTINITIALISED
AfxSocketInit
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
lCommand
no es un comando válido olpArgument
no es un parámetro aceptable paralCommand
o el comando no es aplicable al 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ámetrolpArgument
apunta 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. SiAsyncSelect
se ha emitido en un socket, cualquier intento de usarIOCtl
para 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 deshabilitarAsyncSelect
mediante una llamada aAsyncSelect
con el parámetrolEvent
igual a 0 y, a continuación, llamar aIOCtl
.FIONREAD
Determine el número máximo de bytes que se pueden leer con una llamada aReceive
desde este socket. El parámetrolpArgument
apunta a un valorDWORD
en el queIOCtl
almacena el resultado. Si este socket es de tipoSOCK_STREAM
,FIONREAD
devuelve 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
,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 tipoSOCK_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ónReceive
oReceiveFrom
realizada en el socket recuperará algunos o todos los datos anteriores a la "marca"; la aplicación debe usar la operaciónSIOCATMARK
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ónReceive
oReceiveFrom
nunca se mezclarán datos fuera de banda y datos normales en una misma llamada). El parámetrolpArgument
apunta a un valorDWORD
en el queIOCtl
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:
WSANOTINITIALISED
AfxSocketInit
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 aBind
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ó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.
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.WSAECONNABORTED
La 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 usoWSAEADDRNOTAVAIL
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 argumentolpSockAddrLen
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:
WSANOTINITIALISED
AfxSocketInit
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.WSAEOPNOTSUPP
MSG_OOB
se especificó, pero el socket no es de tipoSOCK_STREAM
.WSAESHUTDOWN
El socket está apagado; no es posible llamar aReceive
en un socket después de haber invocado aShutDown
connHow
establecido en 0 o 2.WSAEWOULDBLOCK
El socket está marcado como de no bloqueo y la operaciónReceive
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 aBind
.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:
WSANOTINITIALISED
AfxSocketInit
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 argumentolpSockAddrLen
no era válido: el búferlpSockAddr
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 aBind
.WSAENOTCONN
El socket no está conectado (soloSOCK_STREAM
).WSAENOTSOCK
El descriptor no es un socket.WSAEOPNOTSUPP
MSG_OOB
se especificó, pero el socket no es de tipoSOCK_STREAM
.WSAESHUTDOWN
El socket está apagado; no es posible llamar aReceiveFrom
en un socket después de haber invocado aShutDown
connHow
establecido en 0 o 2.WSAEWOULDBLOCK
El socket está marcado como de no bloqueo y la operaciónReceiveFrom
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:
WSANOTINITIALISED
AfxSocketInit
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 argumentolpSockAddrLen
no era válido: el búferlpSockAddr
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 aBind
.WSAENOTCONN
El socket no está conectado (soloSOCK_STREAM
).WSAENOTSOCK
El descriptor no es un socket.WSAEOPNOTSUPP
MSG_OOB
se especificó, pero el socket no es de tipoSOCK_STREAM
.WSAESHUTDOWN
El socket está apagado; no es posible llamar aReceiveFromEx
en un socket después de haber invocado aShutDown
connHow
establecido en 0 o 2.WSAEWOULDBLOCK
El socket está marcado como de no bloqueo y la operaciónReceiveFromEx
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:
WSANOTINITIALISED
AfxSocketInit
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 argumentolpBuf
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.WSAEOPNOTSUPP
MSG_OOB
se especificó, pero el socket no es de tipoSOCK_STREAM
.WSAESHUTDOWN
El socket está apagado; no es posible llamar aSend
en un socket después de haber invocado aShutDown
connHow
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 tipoSOCK_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 aBind
.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:
WSANOTINITIALISED
AfxSocketInit
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ámetroslpBuf
olpSockAddr
no forman parte del espacio de direcciones del usuario, o bien el argumentolpSockAddr
es demasiado pequeño (menor que el tamaño de una estructuraSOCKADDR
).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 (soloSOCK_STREAM
).WSAENOTSOCK
El descriptor no es un socket.WSAEOPNOTSUPP
MSG_OOB
se especificó, pero el socket no es de tipoSOCK_STREAM
.WSAESHUTDOWN
El socket está apagado; no es posible llamar aSendTo
en un socket después de haber invocado aShutDown
connHow
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 tipoSOCK_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:
WSANOTINITIALISED
AfxSocketInit
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ámetroslpBuf
olpSockAddr
no forman parte del espacio de direcciones del usuario, o bien el argumentolpSockAddr
es demasiado pequeño (menor que el tamaño de una estructuraSOCKADDR
).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 (soloSOCK_STREAM
).WSAENOTSOCK
El descriptor no es un socket.WSAEOPNOTSUPP
MSG_OOB
se especificó, pero el socket no es de tipoSOCK_STREAM
.WSAESHUTDOWN
El socket está apagado; no es posible llamar aSendToEx
en un socket después de haber invocado aShutDown
connHow
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 tipoSOCK_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:
WSANOTINITIALISED
AfxSocketInit
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
lpOptionValue
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.WSAEINVAL
nLevel
no es válido o la información de nolpOptionValue
es válida.WSAENETRESET
La conexión agota el tiempo de espera cuandoSO_KEEPALIVE
se establece.WSAENOPROTOOPT
La opción es desconocida o no se admite. En concreto,SO_BROADCAST
no se admite en sockets de tipoSOCK_STREAM
, mientras queSO_DONTLINGER
,SO_KEEPALIVE
,SO_LINGER
ySO_OOBINLINE
no se admiten en sockets de tipoSOCK_DGRAM
.WSAENOTCONN
La conexión se restablece cuandoSO_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:
WSANOTINITIALISED
AfxSocketInit
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
nHow
no es válido.WSAEINPROGRESS
Hay una operación de Windows Sockets de bloqueo en curso.WSAENOTCONN
El socket no está conectado (soloSOCK_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)