Funzione PeerDistClientStreamRead (peerdist.h)

PeerDistClientStreamRead legge una sequenza di byte dal flusso di contenuto.

Sintassi

DWORD PeerDistClientStreamRead(
  [in]                PEERDIST_INSTANCE_HANDLE hPeerDist,
  [in]                PEERDIST_CONTENT_HANDLE  hContentHandle,
                      DWORD                    cbMaxNumberOfBytes,
  [in, out, optional] PBYTE                    pBuffer,
                      DWORD                    dwTimeoutInMilliseconds,
  [in]                LPOVERLAPPED             lpOverlapped
);

Parametri

[in] hPeerDist

Un PEERDIST_INSTANCE_HANDLE restituito da PeerDistStartup.

[in] hContentHandle

Handle di contenuto aperto dalla chiamata di funzione PeerDistClientOpenContent .

cbMaxNumberOfBytes

Numero massimo di byte da leggere. Se la funzione cbMaxNumberOfBytesToRead è uguale a 0, indica che la funzione PeerDistClientStreamRead esegue una query sulla lunghezza dei byte di contenuto consecutivi disponibili nella cache locale in corrispondenza dell'offset di lettura del flusso corrente. La query non scarica il contenuto dai peer né restituisce il conteggio dei byte presenti nella peer cache.

[in, out, optional] pBuffer

Puntatore al buffer che riceve i dati dalla cache locale. Questo buffer deve rimanere valido per la durata dell'operazione di lettura. Il chiamante non deve usare questo buffer fino al completamento dell'operazione di lettura. Se l'argomento cbMaxNumberOfBytesToRead è uguale a 0, il parametro pBuffer può essere NULL.

dwTimeoutInMilliseconds

Valore di timeout per la lettura, in millisecondi. Esistono due valori speciali che possono essere specificati:

Valore Significato
PEERDIST_READ_TIMEOUT_LOCAL_CACHE_ONLY
Specifica che una lettura non deve causare alcun traffico di rete aggiuntivo contattando peer o una cache ospitata.
PEERDIST_READ_TIMEOUT_DEFAULT
Specifica il timeout predefinito di 5 secondi.

[in] lpOverlapped

Puntatore a una struttura OVERLAPPED . Stream lettura non consente al chiamante di specificare l'offset iniziale per la lettura. L'offset di lettura del flusso successivo viene gestito in modo implicito per hContentHandle.

Valore restituito

Se la funzione ha esito positivo, il valore restituito è ERROR_IO_PENDING. In caso contrario, la funzione può restituire uno dei valori seguenti:

Codice restituito Descrizione
ERROR_INVALID_PARAMETER
Uno o più parametri non sono validi.
ERROR_INVALID_HANDLE
L'handle hPeerDist o hContent non è valido.
ERROR_ACCESS_DISABLED_BY_POLICY
La funzionalità è disabilitata da Criteri di gruppo.
PEERDIST_ERROR_SERVICE_UNAVAILABLE
Il servizio non è disponibile.

Commenti

PeerDistClientStreamRead accoda la lettura e restituisce immediatamente al chiamante. Di conseguenza, più letture possono essere rilasciate simultaneamente con i buffer di dati usati in modo first-in/first-out. PeerDistClientStreamRead completerà una lettura non appena sono disponibili dati e non attenderà il riempimento completo del buffer.

Se l'operazione di funzione PeerDistClientStreamRead viene completata correttamente, i campi Offset eOffsetHigh della struttura OVERLAPPED verranno popolati con l'offset ULONGLONG in corrispondenza del quale è stata avviata la lettura. Il membro OffsetHigh verrà impostato sui 32 bit superiori dell'offset e il membro Offset verrà impostato sui 32 bit inferiori dell'offset. GetOverlappedResult popolalpNumberOfBytesTransferred con il numero di byte trasferiti. Nel caso in cui il chiamante usi una porta di completamento per elaborare i completamento dell'API di distribuzione peer e quindi lpNumberOfBytes dell'argomento GetQueuedCompletionStatus verrà popolato con il numero di byte trasferiti. L'offset del flusso verrà avanzato in base al numero di byte segnalati come letto. Per eseguire una query sulla lunghezza del contenuto disponibile per contenuti superiori a 4 GB, PeerDistClientBlockRead può essere usato con cbMaxNumberOfBytesToRead uguale a 0 e offset appropriati.

Se l'API viene completata con il valore di errore PEERDIST_ERROR_MISSING_DATA o ERROR_TIMEOUT, i campi Offset e OffsetHigh della struttura OVERLAPPED specificano l'offset ULONGLONG in corrispondenza del quale inizia l'intervallo di dati mancante. Il membro OffsetHigh verrà impostato sui 32 bit superiori dell'offset e il membro Offset verrà impostato sui 32 bit inferiori dell'offset. Questo intervallo di dati mancante è l'offset iniziale (relativo all'inizio del contenuto) e la lunghezza, in byte, che deve essere recuperato da un'origine alternativa, ad esempio il server di contenuto originale. Per consentire al servizio Distribuzione peer di soddisfare la stessa lettura in futuro, aggiungere questi dati alla cache locale chiamando PeerDistClientAddData. La lunghezza dell'intervallo di dati mancante viene specificata dal numero di byte trasferiti (ottenuto tramite GetQueuedCompletionStatus o GetOverlappedResult). L'offset del flusso è avanzato dal numero di byte segnalati come lunghezza dell'intervallo di dati mancante.

Se peerDistClientStreamRead viene chiamato dopo che l'offset di flusso ha superato la fine del contenuto, l'API verrà completata con ERROR_NO_MORE.

È importante notare che l'intervallo di dati mancante può iniziare a qualsiasi offset nel contenuto e essere qualsiasi lunghezza fino alla fine del contenuto. Se le informazioni sul contenuto passate a PeerDistClientAddContentInformation sono state generate in risposta a una richiesta di intervallo, l'intervallo di dati mancante sarà vincolato ai limiti della richiesta di intervallo. Ciò si verifica quando la chiamata a PeerDistServerOpenContentInformation nel server di contenuto ha specificato un offset e una lunghezza che era un intervallo secondario del contenuto nel suo complesso. Un completamento con ERROR_NO_MORE in questo caso indica che l'offset di lettura non rientra nell'intervallo secondario del contenuto.

Richieste di intervallo

Se un client è interessato solo a una parte del contenuto originale, è possibile utilizzare una richiesta di intervallo per recuperare tale parte. Una richiesta di intervallo contiene un offset e una lunghezza del contenuto originale. Le dimensioni delle informazioni sul contenuto sono direttamente proporzionali alle dimensioni del contenuto richiesto.

PeerDistServerOpenContentInformation supporta la generazione di informazioni sul contenuto per una richiesta di intervallo tramite i parametri ullContentOffset e cbContentLength . Il parametro ullContentOffset rappresenta l'offset nel contenuto originale in cui inizia l'intervallo e cbContentLength rappresenta la lunghezza dell'intervallo.

Dopo aver ottenuto informazioni sul contenuto che rappresentano un intervallo di contenuto specifico, le informazioni sul contenuto funzionano facilmente con le API PeerDistClientOpenContent, PeerDistClientAddContentInformation e PeerDistClientCompleteContentInformation . Le informazioni sul contenuto possono essere passate a PeerDistServerOpenContentInformation e associano l'PEERDIST_CONTENT_HANDLE all'intervallo di contenuto. PeerDistClientStreamRead è vincolato dall'offset ullContentOffset e dalla lunghezza cbContentLength specificata nella chiamata sul lato server a PeerDistServerRetrieveContentInformation. PeerDistClientStreamRead inizierà a ullContentOffset e verrà completato con il codice di errore PEERDIST_ERROR_NO_MORE quando la fine dell'intervallo di contenuto viene raggiunta a ullContentOffset + cbContentLength. PeerDistClientBlockRead verrà completato con il codice di errore PEERDIST_ERROR_NO_MORE se l'offset specificato nel parametro OVERLAPPED è minore di ullContentOffset o maggiore di ullContentOffset + cbContentLength. PeerDistClientStreamRead e PeerDistClientBlockRead limitano la quantità di dati mancanti segnalati all'intervallo di contenuto specificato nelle informazioni sul contenuto associate alla PEERDIST_CONTENT_HANDLE. Ad esempio, se le informazioni sul contenuto rappresentano solo la prima metà del contenuto, i dati mancanti saranno limitati alla prima metà del contenuto. In tutti gli altri aspetti, PeerDistClientBlockRead e PeerDistClientStreamRead funzionano con intervalli di contenuto esattamente allo stesso modo in cui funzionano con il contenuto nel suo complesso.

Un client può usare PeerDistClientStreamRead o PeerDistClientBlockRead per recuperare il contenuto dall'offset specificato dall'oggetto ullContentOffset fino alla lunghezza specificata da cbContentLength nella chiamata PeerDistServerRetrieveContentInformation . Sia PeerDistClientStreamRead che PeerDistClientBlockRead completerà con PEERDIST_ERROR_NO_MORE se il client tenta di leggere oltre l'intervallo specificato da ullContentOffset e cbContentLength. Inoltre, PeerDistClientBlockRead completerà anche con il codice di errore PEERDIST_ERROR_NO_MORE se l'offset specificato nel parametro OVERLAPPED è minore di ullContentOffset

Se la lettura non può essere completata dalla cache locale o dalla cache peer, peerDistClientStreamRead e PeerDistClientBlockRead segnala PEERDIST_ERROR_MISSING_DATA. Quando si usano le informazioni sul contenuto a intervalli, PeerDistClientStreamRead segnala i dati mancanti dall'offset iniziale dell'intervallo fino alla fine dell'intervallo. PeerDistClientBlockRead segnala i dati mancanti dall'offset iniziale dell'intervallo fino alla fine dell'intervallo.

PeerDistClientAddData consente di aggiungere i dati del contenuto anche se si trova all'esterno dell'intervallo di contenuto. Questi dati estesi verranno convalidati dopo l'aggiunta delle informazioni sul contenuto corrispondenti alla cache locale. Dopo la convalida, diventa disponibile per i peer. In altre parole, se un client aggiunge solo informazioni sul contenuto per la prima metà del contenuto, PeerDistClientAddData consente comunque al client di aggiungere dati per l'intero contenuto. Tuttavia, la seconda metà del contenuto non verrà convalidata finché non sono state aggiunte le informazioni relative al contenuto per la seconda metà. Nessun'altra API di distribuzione peer è interessata dalle richieste di intervallo.

Requisiti

Requisito Valore
Client minimo supportato Windows 7 Professional [solo app desktop]
Server minimo supportato Windows Server 2008 R2 [solo app desktop]
Piattaforma di destinazione Windows
Intestazione peerdist.h
Libreria PeerDist.lib
DLL PeerDist.dll

Vedi anche

PeerDistClientAddContentInformation

PeerDistClientCloseContent

PeerDistClientOpenContent

PeerDistServerOpenContentInformation

PeerDistStartup