Función PeerDistClientBlockRead (peerdist.h)
La función PeerDistClientBlockRead lee bloques de datos de contenido.
Sintaxis
DWORD PeerDistClientBlockRead(
[in] PEERDIST_INSTANCE_HANDLE hPeerDist,
[in] PEERDIST_CONTENT_HANDLE hContentHandle,
DWORD cbMaxNumberOfBytes,
[in, out, optional] PBYTE pBuffer,
DWORD dwTimeoutInMilliseconds,
[in] LPOVERLAPPED lpOverlapped
);
Parámetros
[in] hPeerDist
Una PEERDIST_INSTANCE_HANDLE devuelta por PeerDistStartup.
[in] hContentHandle
Identificador de contenido abierto por la llamada de función PeerDistClientOpenContent .
cbMaxNumberOfBytes
Número máximo de bytes que se pueden leer. Si cbMaxNumberOfBytesToRead es igual a 0, indica que la función PeerDistClientBlockRead está consultando la longitud de los bytes de contenido consecutivos disponibles en la memoria caché local en el desplazamiento de lectura del bloque actual. La consulta no descargará contenido de los elementos del mismo nivel ni devolverá el recuento de bytes presentes en la caché del mismo nivel.
[in, out, optional] pBuffer
Puntero al búfer que recibe los datos de la caché local. Este búfer debe permanecer válido durante la operación de lectura. El autor de la llamada no debe usar este búfer hasta que se complete la operación de lectura. Si el argumento cbMaxNumberOfBytesToRead es igual a 0, el parámetro pBuffer puede ser NULL.
dwTimeoutInMilliseconds
Valor de tiempo de espera para la lectura, en milisegundos. Hay dos valores especiales que se pueden especificar:
[in] lpOverlapped
Puntero a una estructura SUPERPUESTA . El desplazamiento inicial de lectura se especifica estableciendo los miembros Offset y OffsetHigh de la estructura SUPERPUESTA . El miembro OffsetHigh debe establecerse en los 32 bits superiores del desplazamiento inicial y el miembro Offset debe establecerse en los 32 bits inferiores del desplazamiento inicial.
Valor devuelto
Si la función se ejecuta correctamente, el valor devuelto es ERROR_IO_PENDING. De lo contrario, es posible que la función devuelva uno de los siguientes valores:
Código devuelto | Descripción |
---|---|
|
Uno o varios parámetros no son válidos. |
|
El identificador hPeerDist o hContent no es válido. |
|
La característica está deshabilitada por directiva de grupo. |
|
El servicio no está disponible. |
Comentarios
PeerDistClientBlockRead pone en cola la lectura y vuelve inmediatamente al autor de la llamada. Como resultado, se pueden emitir varias lecturas simultáneamente. PeerDistClientBlockRead completará una lectura tan pronto como haya datos disponibles y no esperará a que el búfer se rellene por completo.
Si la operación de función PeerDistClientBlockRead se completa correctamente, los campos Offset y OffsetHigh de la estructura SUPERPUESTA se rellenarán con el desplazamiento ULONGLONG en el que se inició la lectura. El miembro OffsetHigh se establecerá en los 32 bits superiores del desplazamiento y el miembro Offset se establecerá en los 32 bits inferiores del desplazamiento. GetOverlappedResult rellenará lpNumberOfBytesTransferred con el número de bytes transferidos. En caso de que el autor de la llamada use un puerto de finalización para procesar las finalizaciones de la API de distribución del mismo nivel, el argumento lpNumberOfBytes de GetQueuedCompletionStatus se rellenará con el número de bytes transferidos.
Si el argumento cbMaxNumberOfBytesToRead es igual a 0 y la función PeerDistClientBlockRead se completa correctamente, el número de bytes transferidos (obtenidos a través de GetQueuedCompletionStatus o GetOverlappedResult) contendrán la longitud real del contenido disponible en la caché local.
Cuando esta API se completa con valores de error PEERDIST_ERROR_MISSING_DATA o ERROR_TIMEOUT, los campos Offset y OffsetHigh de la estructura SUPERPUESTA especifican el desplazamiento de ULONGLONG en el que comienza el intervalo de datos que falta. El miembro OffsetHigh se establecerá en los 32 bits superiores del desplazamiento y el miembro Offset se establecerá en los 32 bits inferiores del desplazamiento. Este intervalo de datos que falta es el desplazamiento inicial (relativo al inicio del contenido) y la longitud, en bytes, que deben recuperarse de un origen alternativo, como el servidor de contenido original. Para permitir que el servicio de distribución del mismo nivel satisfaga la misma lectura en el futuro, agregue estos datos a la caché local llamando a PeerDistClientAddData. La longitud del intervalo de datos que falta se especifica mediante el número de bytes transferidos (obtenidos a través de GetQueuedCompletionStatus o GetOverlappedResult).
Es importante tener en cuenta que el intervalo de datos que falta puede comenzar en cualquier desplazamiento del contenido y ser cualquier longitud hasta el final del contenido. En caso de que la información de contenido pasada a PeerDistClientAddContentInformation se generó en respuesta a una solicitud de intervalo, el intervalo de datos que falta se restringirá a los límites de solicitud de intervalo. Esto ocurre cuando la llamada a PeerDistServerOpenContentInformation en el servidor de contenido especificó un desplazamiento y una longitud que era un sub rango del contenido en su conjunto. Una finalización con ERROR_NO_MORE en este caso indica que el desplazamiento de lectura está fuera del intervalo secundario del contenido.
Solicitudes de intervalo
Si un cliente está interesado solo en una parte del contenido original, se puede usar una solicitud de intervalo para recuperar esa parte. Una solicitud de intervalo contiene un desplazamiento y una longitud del contenido original. El tamaño de la información de contenido es directamente proporcional al tamaño del contenido solicitado.PeerDistServerOpenContentInformation admite la generación de información de contenido para una solicitud de intervalo a través de los parámetros ullContentOffset y cbContentLength . El parámetro ullContentOffset representa el desplazamiento en el contenido original donde comienza el intervalo y cbContentLength representa la longitud del intervalo.
Una vez que un cliente obtiene información de contenido que representa un intervalo de contenido determinado, esa información de contenido funciona sin problemas con las API PeerDistClientOpenContent, PeerDistClientAddContentInformation y PeerDistClientCompleteContentInformation . La información de contenido se puede pasar a PeerDistServerOpenContentInformation y asociará el PEERDIST_CONTENT_HANDLE con el intervalo de contenido. PeerDistClientStreamRead está restringido por el desplazamiento ullContentOffset y la longitud cbContentLength especificada en la llamada del lado servidor a PeerDistServerRetrieveContentInformation. PeerDistClientStreamRead comenzará en ullContentOffset y se completará con el código de error PEERDIST_ERROR_NO_MORE cuando se alcance el final del intervalo de contenido en ullContentOffset + cbContentLength. PeerDistClientBlockRead se completará con el código de error PEERDIST_ERROR_NO_MORE si el desplazamiento especificado en el parámetro OVERLAPPED es menor que ullContentOffset o mayor que ullContentOffset + cbContentLength. PeerDistClientStreamRead y PeerDistClientBlockRead limitan la cantidad de datos que faltan notificados al intervalo de contenido especificado en la información de contenido asociada al PEERDIST_CONTENT_HANDLE. Por ejemplo, si la información de contenido representa solo la primera mitad del contenido, los datos que faltan se limitarán a la primera mitad del contenido. En todos los demás aspectos, PeerDistClientBlockRead y PeerDistClientStreamRead funcionan con intervalos de contenido exactamente de la misma manera en que funcionan con el contenido en su conjunto.
Un cliente puede usar PeerDistClientStreamRead o PeerDistClientBlockRead para recuperar el contenido del desplazamiento especificado por ullContentOffset hasta la longitud especificada por cbContentLength en la llamada PeerDistServerRetrieveContentInformation . PeerDistClientStreamRead y PeerDistClientBlockRead se completarán con PEERDIST_ERROR_NO_MORE si el cliente intenta leer más allá del intervalo especificado por ullContentOffset y cbContentLength. Además, PeerDistClientBlockRead también se completará con el código de error PEERDIST_ERROR_NO_MORE si el desplazamiento especificado en el parámetro OVERLAPPED es menor que ullContentOffset.
Si no se puede completar la lectura desde la caché local o la caché del mismo nivel, PeerDistClientStreamRead y PeerDistClientBlockRead notificarán PEERDIST_ERROR_MISSING_DATA. Al usar la información de contenido rango, PeerDistClientStreamRead notificará que faltan datos desde el desplazamiento inicial del intervalo hasta el final del intervalo. PeerDistClientBlockRead notificará que faltan datos desde el desplazamiento inicial del intervalo hasta el final del intervalo.
PeerDistClientAddData permite agregar datos de contenido incluso si se encuentra fuera del intervalo de contenido. Estos datos extendidos se validarán después de agregar la información de contenido correspondiente a la memoria caché local. Una vez validado, estará disponible para los elementos del mismo nivel. En otras palabras, si un cliente agrega solo información de contenido para la primera mitad de contenido, PeerDistClientAddData permite al cliente agregar datos para todo el contenido. Sin embargo, la segunda mitad del contenido no se validará hasta que se haya agregado la información de contenido correspondiente a la segunda mitad. Ninguna otra API de distribución del mismo nivel se ve afectada por las solicitudes de intervalo.
Requisitos
Requisito | Value |
---|---|
Cliente mínimo compatible | Windows 7 Professional [solo aplicaciones de escritorio] |
Servidor mínimo compatible | Windows Server 2008 R2 [solo aplicaciones de escritorio] |
Plataforma de destino | Windows |
Encabezado | peerdist.h |
Library | PeerDist.lib |
Archivo DLL | PeerDist.dll |
Consulte también
PeerDistClientAddContentInformation