Função PeerDistClientBlockRead (peerdist.h)

A função PeerDistClientBlockRead lê blocos de dados de conteúdo.

Sintaxe

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

Um PEERDIST_INSTANCE_HANDLE retornado por PeerDistStartup.

[in] hContentHandle

Um identificador de conteúdo aberto pela chamada de função PeerDistClientOpenContent .

cbMaxNumberOfBytes

O número máximo de bytes a serem lidos. Se o cbMaxNumberOfBytesToRead for igual a 0, ele indicará que a função PeerDistClientBlockRead está consultando o comprimento dos bytes de conteúdo consecutivos disponíveis no cache local no deslocamento de leitura do bloco atual. A consulta não baixará o conteúdo dos pares nem retornará a contagem de bytes presentes no cache par.

[in, out, optional] pBuffer

Ponteiro para o buffer que recebe os dados do cache local. Esse buffer deve permanecer válido durante a operação de leitura. O chamador não deve usar esse buffer até que a operação de leitura seja concluída. Se o argumento cbMaxNumberOfBytesToRead for igual a 0, o parâmetro pBuffer poderá ser NULL

dwTimeoutInMilliseconds

Valor de tempo limite para a leitura, em milissegundos. Há dois valores especiais que podem ser especificados:

Valor Significado
PEERDIST_READ_TIMEOUT_LOCAL_CACHE_ONLY
Especifica que uma leitura não deve causar nenhum tráfego de rede adicional entrando em contato com pares ou com um Cache Hospedado.
PEERDIST_READ_TIMEOUT_DEFAULT
Especifica o tempo limite padrão de 5 segundos.

[in] lpOverlapped

Ponteiro para uma estrutura OVERLAPPED . O deslocamento inicial para leitura é especificado definindo os membros Offset e OffsetHigh da estrutura OVERLAPPED . O membro OffsetHigh deve ser definido como os 32 bits mais altos do deslocamento inicial e o membro Offset deve ser definido como os 32 bits inferiores do deslocamento inicial.

Retornar valor

Se a função for bem-sucedida, o valor retornado será ERROR_IO_PENDING. Caso contrário, a função pode retornar um dos seguintes valores:

Código de retorno Descrição
ERROR_INVALID_PARAMETER
Um ou mais parâmetros são inválidos.
ERROR_INVALID_HANDLE
O identificador hPeerDist ou hContent é inválido.
ERROR_ACCESS_DISABLED_BY_POLICY
O recurso é desabilitado por Política de Grupo.
PEERDIST_ERROR_SERVICE_UNAVAILABLE
O serviço está indisponível.

Comentários

PeerDistClientBlockRead enfileira a leitura e retorna imediatamente ao chamador. Como resultado, várias leituras podem ser emitidas simultaneamente. PeerDistClientBlockRead concluirá uma leitura assim que todos os dados estiverem disponíveis e não aguardará o preenchimento completo do buffer.

Se a operação de função PeerDistClientBlockRead for concluída com êxito, os campos Offset e OffsetHigh da estrutura OVERLAPPED serão preenchidos com o deslocamento ULONGLONG no qual a leitura foi iniciada. O membro OffsetHigh será definido como os 32 bits mais altos do deslocamento e o membro Offset será definido como os 32 bits inferiores do deslocamento. GetOverlappedResult preencherá lpNumberOfBytesTransferred com o número de bytes transferidos. Caso o chamador esteja usando uma porta de conclusão para processar conclusões da API de Distribuição de Pares, o argumento lpNumberOfBytes de GetQueuedCompletionStatus será preenchido com o número de bytes transferidos.

Se o argumento cbMaxNumberOfBytesToRead for igual a 0 e a função PeerDistClientBlockRead for concluída com êxito, o número de bytes transferidos (obtidos por meio de GetQueuedCompletionStatus ou GetOverlappedResult) conterá o comprimento real do conteúdo disponível no cache local.

Quando essa API é concluída com valores de erro PEERDIST_ERROR_MISSING_DATA ou ERROR_TIMEOUT, os campos Offset e OffsetHigh da estrutura OVERLAPPED especificam o deslocamento ULONGLONG no qual o intervalo de dados ausente começa. O membro OffsetHigh será definido como os 32 bits mais altos do deslocamento e o membro Offset será definido como os 32 bits inferiores do deslocamento. Esse intervalo de dados ausente é o deslocamento inicial (relativo ao início do conteúdo) e o comprimento, em bytes, que precisa ser recuperado de uma fonte alternativa, como o servidor de conteúdo original. Para permitir que o serviço distribuição de pares satisfaça a mesma leitura no futuro, adicione esses dados ao cache local chamando PeerDistClientAddData. O comprimento do intervalo de dados ausente é especificado pelo número de bytes transferidos (obtidos por meio de GetQueuedCompletionStatus ou GetOverlappedResult).

É importante observar que o intervalo de dados ausente pode começar em qualquer deslocamento no conteúdo e ter qualquer comprimento até o final do conteúdo. Caso as informações de conteúdo passadas para PeerDistClientAddContentInformation sejam geradas em resposta a uma solicitação de intervalo, o intervalo de dados ausente será restrito aos limites de solicitação de intervalo. Isso ocorre quando a chamada para PeerDistServerOpenContentInformation no servidor de conteúdo especificou um deslocamento e um comprimento que era um sub-intervalo do conteúdo como um todo. Uma conclusão com ERROR_NO_MORE nesse caso indica que o deslocamento de leitura está fora do sub-intervalo do conteúdo.

Solicitações de intervalo

Se um cliente estiver interessado em apenas uma parte do conteúdo original, uma solicitação de intervalo poderá ser usada para recuperar essa parte. Uma solicitação de intervalo contém um deslocamento e um comprimento do conteúdo original. O tamanho das informações de conteúdo é diretamente proporcional ao tamanho do conteúdo solicitado.

PeerDistServerOpenContentInformation dá suporte à geração de informações de conteúdo para uma solicitação de intervalo por meio dos parâmetros ullContentOffset e cbContentLength . O parâmetro ullContentOffset representa o deslocamento no conteúdo original em que o intervalo começa e cbContentLength representa o comprimento do intervalo.

Depois que um cliente obtém informações de conteúdo que representam um intervalo de conteúdo específico, essas informações de conteúdo funcionam perfeitamente com as APIs PeerDistClientOpenContent, PeerDistClientAddContentInformation e PeerDistClientCompleteContentInformation . As informações de conteúdo podem ser passadas para PeerDistServerOpenContentInformation e associarão o PEERDIST_CONTENT_HANDLE ao intervalo de conteúdo. PeerDistClientStreamRead é restrito pelo deslocamento ullContentOffset e pelo comprimento cbContentLength especificado na chamada do lado do servidor para PeerDistServerRetrieveContentInformation. PeerDistClientStreamRead começará em ullContentOffset e será concluído com o código de erro PEERDIST_ERROR_NO_MORE quando o final do intervalo de conteúdo for atingido em ullContentOffset + cbContentLength. PeerDistClientBlockRead será concluído com o código de erro PEERDIST_ERROR_NO_MORE se o deslocamento especificado no parâmetro OVERLAPPED for menor que ullContentOffset ou maior que ullContentOffset + cbContentLength. PeerDistClientStreamRead e PeerDistClientBlockRead limitam a quantidade de dados ausentes relatados ao intervalo de conteúdo especificado nas informações de conteúdo associadas ao PEERDIST_CONTENT_HANDLE. Por exemplo, se as informações de conteúdo representarem apenas a primeira metade do conteúdo, os dados ausentes serão limitados à primeira metade do conteúdo. Em todos os outros aspectos, PeerDistClientBlockRead e PeerDistClientStreamRead funcionam com intervalos de conteúdo exatamente da mesma maneira em que trabalham com o conteúdo como um todo.

Um cliente pode usar PeerDistClientStreamRead ou PeerDistClientBlockRead para recuperar o conteúdo do deslocamento especificado pelo ullContentOffset até o comprimento especificado por cbContentLength na chamada PeerDistServerRetrieveContentInformation . PeerDistClientStreamRead e PeerDistClientBlockRead serão concluídos com PEERDIST_ERROR_NO_MORE se o cliente tentar ler além do intervalo especificado por ullContentOffset e cbContentLength. Além disso, PeerDistClientBlockRead também será concluído com o código de erro PEERDIST_ERROR_NO_MORE se o deslocamento especificado no parâmetro OVERLAPPED for menor que ullContentOffset

Se a leitura não puder ser concluída do cache local ou do cache par, PeerDistClientStreamRead e PeerDistClientBlockRead relatarão PEERDIST_ERROR_MISSING_DATA. Ao usar as informações de conteúdo intervalo, PeerDistClientStreamRead relatará um dado ausente do deslocamento inicial do intervalo até o final do intervalo. PeerDistClientBlockRead relatará dados ausentes desde o deslocamento inicial do intervalo até o final do intervalo.

PeerDistClientAddData permite que os dados de conteúdo sejam adicionados mesmo que estejam fora do intervalo de conteúdo. Esses dados estendidos serão validados depois que as informações de conteúdo correspondentes forem adicionadas ao cache local. Depois de validado, ele fica disponível para pares. Em outras palavras, se um cliente adicionar apenas informações de conteúdo para a primeira metade do conteúdo, PeerDistClientAddData ainda permitirá que o cliente adicione dados para todo o conteúdo. No entanto, a segunda metade do conteúdo não será validada até que as informações de conteúdo correspondentes do segundo semestre sejam adicionadas. Nenhuma outra APIs de Distribuição de Pares é afetada por solicitações de intervalo.

Requisitos

Requisito Valor
Cliente mínimo com suporte Windows 7 Professional [somente aplicativos da área de trabalho]
Servidor mínimo com suporte Windows Server 2008 R2 [somente aplicativos da área de trabalho]
Plataforma de Destino Windows
Cabeçalho peerdist.h
Biblioteca PeerDist.lib
DLL PeerDist.dll

Confira também

PeerDistClientAddContentInformation

PeerDistClientOpenContent

PeerDistServerOpenContentInformation

PeerDistStartup