Funzione PeerDistClientBlockRead (peerdist.h)

La funzione PeerDistClientBlockRead legge i blocchi di dati del contenuto.

Sintassi

DWORD PeerDistClientBlockRead(
  [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 cbMaxNumberOfBytesToRead è uguale a 0, indica che la funzione PeerDistClientBlockRead esegue una query sulla lunghezza dei byte di contenuto consecutivi disponibili nella cache locale in corrispondenza dell'offset di lettura del blocco corrente. La query non scaricherà né il contenuto dai peer né restituirà il numero di 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, espresso in millisecondi. È possibile specificare due valori speciali:

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

[in] lpOverlapped

Puntatore a una struttura OVERLAPPED . L'offset iniziale per la lettura viene specificato impostando i membri Offset e OffsetHigh della struttura OVERLAPPED . Il membro OffsetHigh deve essere impostato sui 32 bit superiori dell'offset iniziale e il membro Offset deve essere impostato sui 32 bit inferiori dell'offset iniziale.

Valore restituito

Se la funzione ha esito positivo, il valore restituito viene 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

PeerDistClientBlockRead accoda la lettura e torna immediatamente al chiamante. Di conseguenza, è possibile eseguire più letture contemporaneamente. PeerDistClientBlockRead completerà una lettura non appena sono disponibili dati e non attenderà il riempimento completo del buffer.

Se l'operazione di funzione PeerDistClientBlockRead viene completata correttamente, i campi Offset e OffsetHigh 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 popola lpNumberOfBytesTransferred con il numero di byte trasferiti. Nel caso in cui il chiamante usi una porta di completamento per elaborare i completamenti dell'API di distribuzione peer, l'argomento lpNumberOfBytes di GetQueuedCompletionStatus verrà popolato con il numero di byte trasferiti.

Se l'argomento cbMaxNumberOfBytesToRead è uguale a 0 e la funzione PeerDistClientBlockRead viene completata correttamente, il numero di byte trasferiti (ottenuti tramite GetQueuedCompletionStatus o GetOverlappedResult) conterrà la lunghezza effettiva del contenuto disponibile nella cache locale.

Quando questa API viene completata con valori 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 mancanti è l'offset iniziale (relativo all'inizio del contenuto) e la lunghezza, in byte, che deve essere recuperata da un'origine alternativa, come il server di contenuto originale. Per consentire al servizio di 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).

È importante notare che l'intervallo di dati mancante può iniziare a qualsiasi offset nel contenuto e avere una lunghezza fino alla fine del contenuto. Nel caso in cui le informazioni sul contenuto passate a PeerDistClientAddContentInformation siano 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 del contenuto ha specificato un offset e una lunghezza che rappresenta 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 usare 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 che un client ottiene informazioni sul contenuto che rappresentano un intervallo di contenuto specifico, le informazioni sul contenuto funzionano perfettamente con le API PeerDistClientOpenContent, PeerDistClientAddContentInformation e PeerDistClientCompleteContentInformation . Le informazioni sul contenuto possono essere passate a PeerDistServerOpenContentInformation e associano il 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 completerà il codice di errore PEERDIST_ERROR_NO_MORE quando viene raggiunta la fine dell'intervallo di contenuto 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 entrambi 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 esattamente nello 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 da ullContentOffset fino alla lunghezza specificata da cbContentLength nella chiamata PeerDistServerRetrieveContentInformation . Sia PeerDistClientStreamRead che PeerDistClientBlockRead verranno completati con PEERDIST_ERROR_NO_MORE se il client tenta di leggere oltre l'intervallo specificato da ullContentOffset e cbContentLength. Inoltre , PeerDistClientBlockRead verrà completato 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 peer cache, peerDistClientStreamRead e PeerDistClientBlockRead segnala PEERDIST_ERROR_MISSING_DATA. Quando si usano le informazioni sul contenuto con intervallo, 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 non rientrano nell'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 fino a quando non vengono aggiunte le informazioni sul contenuto corrispondenti 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

PeerDistClientOpenContent

PeerDistServerOpenContentInformation

PeerDistStartup