Función de devolución de llamada LPWSPACCEPT (ws2spi.h)

La función LPWSPAccept acepta condicionalmente una conexión basada en el valor devuelto de una función de condición.

Sintaxis

LPWSPACCEPT Lpwspaccept;

SOCKET Lpwspaccept(
  [in]      SOCKET s,
  [out]     sockaddr *addr,
  [in, out] LPINT addrlen,
  [in]      LPCONDITIONPROC lpfnCondition,
  [in]      DWORD_PTR dwCallbackData,
  [out]     LPINT lpErrno
)
{...}

Parámetros

[in] s

Descriptor que identifica un socket que escucha las conexiones después de un LPWSPListen.

[out] addr

Puntero opcional a un búfer que recibe la dirección de la entidad de conexión, como se conoce al proveedor de servicios. El formato exacto del parámetro addr viene determinado por la familia de direcciones establecida cuando se creó el socket en la estructura sockaddr .

[in, out] addrlen

Puntero opcional a un entero que contiene la longitud del parámetro addr , en bytes.

[in] lpfnCondition

Dirección de instancia de procedimiento de una función opcional-condición amueblada por Windows Sockets. Esta función se usa en la decisión de aceptación o rechazo en función de la información del autor de la llamada que se pasa como parámetros.

[in] dwCallbackData

Datos de devolución de llamada que se van a devolver al cliente de Windows Socket 2 como valor del parámetro dwCallbackData de la función de condición. El proveedor de servicios no interpreta este parámetro.

[out] lpErrno

Puntero al código de error.

Valor devuelto

Si no se produce ningún error, LPWSPAccept devuelve un valor de tipo SOCKET que es un descriptor para el socket aceptado. De lo contrario, se devuelve un valor de INVALID_SOCKET y hay disponible un código de error específico en lpErrno.

Código de error Significado
WSAECONNREFUSED
La solicitud de conexión se rechazó forzosamente como se indica en el valor devuelto de la función de condición (CF_REJECT).
WSAECONNRESET
Se indicó una conexión entrante, pero posteriormente el par remoto finalizó antes de aceptar la llamada.
WSAENETDOWN
Error en el subsistema de red.
WSAEFAULT
El parámetro addrlen es demasiado pequeño o el parámetro lpfnCondition no forma parte del espacio de direcciones del usuario.
WSAEINTR
Se canceló una llamada (de bloqueo) a través de LPWSPCancelBlockingCall.
WSAEINPROGRESS
Hay una llamada de Windows Sockets de bloqueo en curso.
WSAEINVAL
LPWSPListen no se invocó antes de LPWSPAccept, el parámetro g especificado en la función condition no es un valor válido, el valor devuelto de la función de condición no es válido o cualquier caso en el que el socket especificado esté en un estado no válido.
WSAEMFILE
Queue is nonempty upon entry to LPWSPAccept and there are no socket descriptors available.
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.
WSATRY_AGAIN
La aceptación de la solicitud de conexión se aplaza como se indica en el valor devuelto de la función de condición (CF_DEFER).
WSAEWOULDBLOCK
El socket se marca como no desbloqueado y no hay ninguna conexión que se acepte.
WSAEACCES
La solicitud de conexión que se ofreció ha agotado el tiempo de espera o se ha retirado.

Observaciones

La función LPWSPAccept extrae la primera conexión en la cola de conexiones pendientes en los sockets y la comprueba con la función condition, siempre que se especifique la función condition (es decir, no null). La función condition debe ejecutarse en el mismo subproceso que esta rutina. Si la función condition devuelve CF_ACCEPT, LPWSPAccept crea un nuevo socket.

Los sockets recién creados tienen las mismas propiedades que los sockets, incluidos los eventos de red registrados con LPWSPAsyncSelect o con LPWSPEventSelect. Como se describe en DescriptorAllocation, cuando se asignan nuevos descriptores de socket, los proveedores IFS deben llamar a WPUModifyIFSHandle y los proveedores que no son IFS deben llamar a WPUCreateSocketHandle.

Si la función condition devuelve CF_REJECT, LPWSPAccept rechaza la solicitud de conexión. Si la decisión de aceptación o rechazo de la aplicación no se puede tomar inmediatamente, la función de condición devolverá CF_DEFER para indicar que no se ha tomado ninguna decisión. El proveedor de servicios no realizará ninguna acción sobre esta solicitud de conexión. Cuando la aplicación esté lista para tomar medidas en la solicitud de conexión, invocará LPWSPAccept de nuevo y devolverá CF_ACCEPT o CF_REJECT como un valor devuelto de la función de condición.

En el caso de los sockets que están en el modo de bloqueo (valor predeterminado), si no hay ninguna conexión pendiente en la cola, LPWSPAccept bloquea el autor de la llamada hasta que hay una conexión. En el caso de los sockets en modo de no bloqueo, si se llama a esta función cuando no hay conexiones pendientes en la cola, LPWSPAccept devuelve el código de error WSAEWOULDBLOCK. El socket aceptado no se puede usar para aceptar más conexiones. El socket original permanece abierto.

El agregador de parámetros es un parámetro de resultado que se rellena con la dirección de la entidad de conexión, como se conoce al proveedor de servicios. El formato exacto del parámetro addr viene determinado por la familia de direcciones en la que se está produciendo la comunicación. El addrlen es un parámetro value-result; inicialmente contendrá la cantidad de espacio a la que apunta el agregador. Al devolver, debe contener la longitud real (en bytes) de la dirección devuelta por el proveedor de servicios. Esta llamada se usa con tipos de socket orientados a la conexión, como SOCK_STREAM. Si addr o addrlen son iguales a NULL, no se devuelve información sobre la dirección remota del socket aceptado. De lo contrario, estos dos parámetros se rellenarán independientemente de si se especifica la función de condición o lo que devuelve.

El prototipo de la función de condición es el siguiente.

int CALLBACK 
ConditionFunc( 
  IN     LPWSABUF    lpCallerId, 
  IN     LPWSABUF    lpCallerData, 
  IN OUT LPQOS       lpSQOS, 
  IN OUT LPQOS       lpGQOS,
  IN     LPWSABUF    lpCalleeId, 
  IN     LPWSABUF    lpCalleeData, 
  OUT    GROUP FAR * g, 	
  IN     DWORD_PTR   dwCallbackData
);

LpCallerId y lpCallerData son parámetros de valor que deben contener la dirección de la entidad de conexión y los datos de usuario que se enviaron junto con la solicitud de conexión. Si no hay ningún identificador de autor de llamada o datos del autor de la llamada disponibles, el parámetro correspondiente será null. Muchos protocolos de red no admiten datos del autor de llamada en tiempo de conexión. Se espera que la mayoría de los protocolos de red convencionales admitan la información del identificador del autor de la llamada en el momento de la solicitud de conexión. La parte buf del WSABUF apunta a lpCallerId apunta a un sockaddr. El sockaddr se interpreta según su familia de direcciones (normalmente mediante la conversión del sockaddr a algún tipo específico de la familia de direcciones).

El parámetro lpSQOS hace referencia a las especificaciones de flujo para los sockets especificados por el autor de la llamada, uno para cada dirección, seguido de cualquier parámetro adicional específico del proveedor. Los valores de especificación de flujo de envío o recepción se omitirán según corresponda para los sockets unidireccionales. Un valor NULL para lpSQOS indica que no hay ningún QoS proporcionado por el autor de la llamada y que no es posible ninguna negociación. Un puntero lpSQOS no NULL indica que se va a producir una negociación de QoS o que el proveedor está preparado para aceptar la solicitud de QoS sin negociación.

LpCalleeId es un parámetro de valor que contiene la dirección local de la entidad conectada. La parte buf del WSABUF apunta a lpCalleeId apunta a un sockaddr. El sockaddr se interpreta según su familia de direcciones (normalmente mediante la conversión del sockaddr a algún tipo específico de la familia de direcciones).

LpCalleeData es un parámetro de resultado utilizado por la función condition para devolver los datos de usuario a la entidad de conexión. El proveedor de servicios debe proporcionar el almacenamiento de estos datos. LpCalleeData-len> contiene inicialmente la longitud del búfer asignado por el proveedor de servicios y apuntado por lpCalleeData-buf.> Un valor de cero significa que no se admite la transferencia de datos de usuario al autor de la llamada. La función condition copiará hasta lpCalleeData-len> bytes de datos en lpCalleeData-buf> y, a continuación, actualizará lpCalleeData-len> para indicar el número real de bytes transferidos. Si no se devuelve ningún dato de usuario al autor de la llamada, la función condition establecerá lpCalleeData-len> en cero. El formato de todos los datos de dirección y usuario es específico de la familia de direcciones a la que pertenece el socket.

El valor del parámetro dwCallbackData pasado a la función condition es el valor pasado como parámetro dwCallbackData en la llamada LPWSPAccept original. El cliente de Windows Sockets 2 interpreta este valor únicamente. Esto permite a un cliente pasar información de contexto del sitio de llamada LPWSPAccept a través de la función condition, que proporciona la función condition con cualquier información adicional necesaria para determinar si aceptar la conexión. Un uso típico consiste en pasar un puntero (conversión adecuada) a una estructura de datos que contiene referencias a objetos definidos por la aplicación con los que está asociado este socket.

Requisitos

   
Cliente mínimo compatible Windows 2000 Professional [solo aplicaciones de escritorio]
Servidor mínimo compatible Windows 2000 Server [solo aplicaciones de escritorio]
Plataforma de destino Windows
Encabezado ws2spi.h

Consulte también

LPWSPAsyncSelect

LPWSPBind

LPWSPConnect

LPWSPEventSelect

LPWSPGetSockOpt

LPWSPListen

LPWSPSelect

LPWSPSocket