Função PeerDistClientStreamRead (peerdist.h)
O PeerDistClientStreamRead lê uma sequência de bytes do fluxo de conteúdo.
Sintaxe
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
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 PeerDistClientStreamRead está consultando o comprimento dos bytes de conteúdo consecutivos disponíveis no cache local no deslocamento de leitura do fluxo 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:
[in] lpOverlapped
Ponteiro para uma estrutura OVERLAPPED . Stream leitura não permite que o chamador especifique o Deslocamento inicial para a leitura. O próximo deslocamento de leitura de fluxo é mantido implicitamente por hContentHandle.
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 |
---|---|
|
Um ou mais parâmetros são inválidos. |
|
O identificador hPeerDist ou hContent é inválido. |
|
O recurso é desabilitado por Política de Grupo. |
|
O serviço está indisponível. |
Comentários
PeerDistClientStreamRead enfileira a leitura e retorna imediatamente ao chamador. Como resultado, várias leituras podem ser emitidas simultaneamente com os buffers de dados utilizados de maneira inicial/inicial. PeerDistClientStreamRead 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 PeerDistClientStreamRead 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 preenche 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. O deslocamento do fluxo será avançado pelo número de bytes relatados como lidos. Para consultar o comprimento do conteúdo disponível para conteúdo maior que 4 GB, PeerDistClientBlockRead pode ser usado com cbMaxNumberOfBytesToRead igual a 0 e deslocamentos apropriados.
Se a API for concluída com o valor de erro PEERDIST_ERROR_MISSING_DATA ou ERROR_TIMEOUT, os campos Offset e OffsetHigh da estrutura OVERLAPPED especificarão 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 de Distribuição por 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). O deslocamento de fluxo é avançado pelo número de bytes relatados como o comprimento do intervalo de dados ausente.
Se PeerDistClientStreamRead for chamado depois que o deslocamento de fluxo tiver avançado além do final do conteúdo, a API será concluída com ERROR_NO_MORE.
É 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 acontecerá quando a chamada para PeerDistServerOpenContentInformation no servidor de conteúdo especificar 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