Compartir a través de


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 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 el sockaddr estructura.

[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 de condición opcional proporcionada 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 dwCallbackData parámetro de la función condition. 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ó de forma forzada 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 mismo nivel 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 Bloqueo de Windows Sockets 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 condition no es un válido o ningún 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 de búfer disponible.
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 conexiones.
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 conexiones que se acepten.
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 el socket sy 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 eldel socket , 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 proveedores que no sean 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 (predeterminado), si no hay conexiones pendientes en la cola, LPWSPAccept bloquea el autor de la llamada hasta que haya 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 parámetro addr 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 al que apunta agregador. A cambio, 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 de lo que devuelve.

El prototipo de la función condition 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
);

El 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 llamador 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 de llamada en el momento de la solicitud de conexión. La buf de la WSABUF apuntada por lpCallerId apunta a un sockaddr. El de sockaddr se interpreta según su familia de direcciones (normalmente mediante la conversión de la a algún tipo específico de la familia de direcciones).

El parámetro lpSQOS hace referencia a las especificaciones de flujo de socket s especificadas por el autor de la llamada, una para cada dirección, seguida 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 noNULLlpSQOS 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.

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

El 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. El lpCalleeData->len inicialmente contiene 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->bufy, a continuación, actualizar lpCalleeData->len para indicar el número real de bytes transferidos. Si no hay datos de usuario que se devuelvan 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 de LPWSPAccept original. Este valor solo lo interpreta el cliente de Windows Sockets 2. Esto permite que un cliente pase información de contexto del LPWSPAccept sitio de llamada a través de la función condition, que proporciona la función condition con cualquier información adicional necesaria para determinar si se debe aceptar la conexión. Un uso típico es 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

Requisito Valor
cliente mínimo admitido Windows 2000 Professional [solo aplicaciones de escritorio]
servidor mínimo admitido Windows 2000 Server [solo aplicaciones de escritorio]
de la plataforma de destino de Windows
encabezado de ws2spi.h

Consulte también

LPWSPAsyncSelect

LPWSPBind

LPWSPConnect

LPWSPEventSelect

LPWSPGetSockOpt

LPWSPListen

LPWSPSelect

LPWSPSocket