Función PeerDistClientStreamRead (peerdist.h)

PeerDistClientStreamRead lee una secuencia de bytes de la secuencia de contenido.

Sintaxis

DWORD PeerDistClientStreamRead(
  [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 PeerDistClientStreamRead está consultando la longitud de los bytes de contenido consecutivos disponibles en la memoria caché local en el desplazamiento de lectura de secuencia 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:

Valor Significado
PEERDIST_READ_TIMEOUT_LOCAL_CACHE_ONLY
Especifica que una lectura no debe provocar ningún tráfico de red adicional poniéndose en contacto con elementos del mismo nivel o una caché hospedada.
PEERDIST_READ_TIMEOUT_DEFAULT
Especifica el tiempo de espera predeterminado de 5 segundos.

[in] lpOverlapped

Puntero a una estructura SUPERPUESTA . Stream lectura no permite al autor de la llamada especificar el desplazamiento inicial para la lectura. El siguiente desplazamiento de lectura de secuencia se mantiene implícitamente por hContentHandle.

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
ERROR_INVALID_PARAMETER
Uno o varios parámetros no son válidos.
ERROR_INVALID_HANDLE
El identificador hPeerDist o hContent no es válido.
ERROR_ACCESS_DISABLED_BY_POLICY
La característica está deshabilitada por directiva de grupo.
PEERDIST_ERROR_SERVICE_UNAVAILABLE
El servicio no está disponible.

Comentarios

PeerDistClientStreamRead pone en cola la lectura y vuelve inmediatamente al autor de la llamada. Como resultado, se pueden emitir varias lecturas simultáneamente con los búferes de datos utilizados de una manera primera y primera salida. PeerDistClientStreamRead 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 PeerDistClientStreamRead se completa correctamente, los campos Offset y OffsetHigh de la estructura SUPERPUESTA se rellenarán con el desplazamiento de 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 rellena 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. El desplazamiento de la secuencia estará avanzado por el número de bytes notificados como leídos. Para consultar la longitud del contenido disponible para el contenido de más de 4 GB, PeerDistClientBlockRead se puede usar con cbMaxNumberOfBytesToRead igual a 0 y desplazamientos adecuados.

Si la API se completa con el valor 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). El desplazamiento de la secuencia está avanzado por el número de bytes notificados como la longitud del intervalo de datos que falta.

Si se llama a PeerDistClientStreamRead después de que el desplazamiento de la secuencia haya avanzado más allá del final del contenido, la API se completará con ERROR_NO_MORE.

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 ocurrirá 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

PeerDistClientCloseContent

PeerDistClientOpenContent

PeerDistServerOpenContentInformation

PeerDistStartup