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 |
---|---|
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). | |
Se indicó una conexión entrante, pero posteriormente el mismo nivel remoto finalizó antes de aceptar la llamada. | |
Error en el subsistema de red. | |
El parámetro addrlen es demasiado pequeño o el parámetro lpfnCondition no forma parte del espacio de direcciones del usuario. | |
Se canceló una llamada (de bloqueo) a través de LPWSPCancelBlockingCall. | |
Hay una llamada de Bloqueo de Windows Sockets en curso. | |
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. | |
Queue is nonempty upon entry to LPWSPAccept and there are no socket descriptors available. | |
No hay espacio de búfer disponible. | |
El descriptor no es un socket. | |
El socket al que se hace referencia no es un tipo que admite el servicio orientado a conexiones. | |
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). | |
El socket se marca como no desbloqueado y no hay conexiones que se acepten. | |
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
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
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
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 no
El lpCalleeId es un parámetro de valor que contiene la dirección local de la entidad conectada. El
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
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 |