PeerDistClientStreamRead-Funktion (peerdist.h)

PeerDistClientStreamRead liest eine Bytesequenz aus dem Inhaltsstream.

Syntax

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

Parameter

[in] hPeerDist

Eine vonPeerDistStartup zurückgegebene PEERDIST_INSTANCE_HANDLE.

[in] hContentHandle

Ein Inhaltshandle, das durch den Aufruf der PeerDistClientOpenContent-Funktion geöffnet wird.

cbMaxNumberOfBytes

Die maximale Anzahl der zu lesenden Bytes. Wenn cbMaxNumberOfBytesToRead gleich 0 ist, gibt dies an, dass die PeerDistClientStreamRead-Funktion die Länge der verfügbaren aufeinanderfolgenden Inhaltsbytes im lokalen Cache beim aktuellen Stream-Leseoffset abfragt. Die Abfrage lädt weder Inhalte von den Peers herunter, noch gibt die Anzahl der im Peercache vorhandenen Bytes zurück.

[in, out, optional] pBuffer

Zeiger auf den Puffer, der die Daten aus dem lokalen Cache empfängt. Dieser Puffer muss für die Dauer des Lesevorgangs gültig bleiben. Der Aufrufer darf diesen Puffer erst verwenden, wenn der Lesevorgang abgeschlossen ist. Wenn das argument cbMaxNumberOfBytesToRead gleich 0 ist, kann der pBuffer-ParameterNULL sein.

dwTimeoutInMilliseconds

Timeoutwert für den Lesevorgang in Millisekunden. Es können zwei besondere Werte angegeben werden:

Wert Bedeutung
PEERDIST_READ_TIMEOUT_LOCAL_CACHE_ONLY
Gibt an, dass ein Lesevorgang keinen zusätzlichen Netzwerkdatenverkehr verursachen soll, indem Peers oder ein gehosteter Cache kontaktiert werden.
PEERDIST_READ_TIMEOUT_DEFAULT
Gibt das Standardtimeout von 5 Sekunden an.

[in] lpOverlapped

Zeiger auf eine ÜBERLAPPENDE Struktur. Stream Lesevorgang erlaubt es dem Aufrufer nicht, den Startoffset für den Lesevorgang anzugeben. Der nächste Stream-Leseoffset wird implizit per hContentHandle beibehalten.

Rückgabewert

Wenn die Funktion erfolgreich ist, wird der Rückgabewert ERROR_IO_PENDING. Andernfalls gibt die Funktion möglicherweise einen der folgenden Werte zurück:

Rückgabecode Beschreibung
ERROR_INVALID_PARAMETER
Mindestens ein Parameter ist ungültig.
ERROR_INVALID_HANDLE
Das hPeerDist - oder hContent-Handle ist ungültig.
ERROR_ACCESS_DISABLED_BY_POLICY
Das Feature wird von Gruppenrichtlinie deaktiviert.
PEERDIST_ERROR_SERVICE_UNAVAILABLE
Der Dienst ist nicht verfügbar.

Hinweise

PeerDistClientStreamRead warteschlangent den Lesevorgang und kehrt sofort an den Aufrufer zurück. Daher können mehrere Lesevorgänge gleichzeitig mit den Datenpuffern ausgegeben werden, die in einer First-in-/First-Out-Weise verwendet werden. PeerDistClientStreamRead schließt einen Lesevorgang ab, sobald Daten verfügbar sind, und wartet nicht, bis der Puffer vollständig gefüllt ist.

Wenn der Vorgang der PeerDistClientStreamRead-Funktion erfolgreich abgeschlossen wurde, werden die Felder Offset und OffsetHigh der OVERLAPPED-Struktur mit dem ULONGLONG-Offset aufgefüllt, an dem der Lesevorgang gestartet wurde. Der OffsetHigh-Member wird auf die höheren 32 Bits des Offsets festgelegt, und der Offset-Member wird auf die unteren 32 Bits des Offsets festgelegt. GetOverlappedResult füllt lpNumberOfBytesTransferred mit der Anzahl der übertragenen Bytes auf. Wenn der Aufrufer einen Vervollständigungsport verwendet, um die Vervollständigung der Peerverteilungs-API zu verarbeiten, wird das lpNumberOfBytes-Argument von GetQueuedCompletionStatus mit der Anzahl der übertragenen Bytes aufgefüllt. Der Streamoffset wird um die Anzahl der Als gelesen gemeldeten Bytes erweitert. Zum Abfragen der Länge verfügbarer Inhalte für Inhalte, die größer als 4 GB sind, kann PeerDistClientBlockRead mit cbMaxNumberOfBytesToRead gleich 0 und entsprechenden Offsets verwendet werden.

Wenn die API mit dem Fehlerwert PEERDIST_ERROR_MISSING_DATA oder ERROR_TIMEOUT abgeschlossen wird, geben die Felder Offset und OffsetHigh der OVERLAPPED-Struktur den ULONGLONGLONG-Offset an, an dem der fehlende Datenbereich beginnt. Der OffsetHigh-Member wird auf die höheren 32 Bits des Offsets festgelegt, und der Offset-Member wird auf die unteren 32 Bits des Offsets festgelegt. Dieser fehlende Datenbereich ist der Startoffset (relativ zum Start des Inhalts) und die Länge in Bytes, die von einer alternativen Quelle wie dem ursprünglichen Inhaltsserver abgerufen werden müssen. Damit der Peerverteilungsdienst denselben Lesevorgang in Zukunft erfüllen kann, fügen Sie diese Daten dem lokalen Cache hinzu, indem Sie PeerDistClientAddData aufrufen. Die Länge des fehlenden Datenbereichs wird durch die Anzahl der übertragenen Bytes angegeben (abgerufen über GetQueuedCompletionStatus oder GetOverlappedResult). Der Streamoffset wird um die Anzahl der Bytes erweitert, die als Länge des fehlenden Datenbereichs gemeldet werden.

Wenn PeerDistClientStreamRead aufgerufen wird, nachdem der Streamoffset über das Ende des Inhalts hinaus fortgeschritten ist, wird die API mit ERROR_NO_MORE abgeschlossen.

Es ist wichtig zu beachten, dass der fehlende Datenbereich mit einem beliebigen Offset im Inhalt beginnen und eine beliebige Länge bis zum Ende des Inhalts aufweisen kann. Wenn die an PeerDistClientAddContentInformation übergebenen Inhaltsinformationen als Reaktion auf eine Bereichsanforderung generiert wurden, wird der fehlende Datenbereich auf die Bereichsanforderungsgrenzen beschränkt. Dies geschieht, wenn der Aufruf von PeerDistServerOpenContentInformation auf dem Inhaltsserver einen Offset und eine Länge angegeben hat, die ein Unterbereich des gesamten Inhalts war. Eine Vervollständigung mit ERROR_NO_MORE gibt in diesem Fall an, dass sich der Leseoffset außerhalb des Unterbereichs des Inhalts befindet.

Bereichsanforderungen

Wenn ein Client nur an einem Teil des ursprünglichen Inhalts interessiert ist, kann eine Bereichsanforderung verwendet werden, um diesen Teil abzurufen. Eine Bereichsanforderung enthält einen Offset und eine Länge des ursprünglichen Inhalts. Die Größe der Inhaltsinformationen ist direkt proportional zur Größe des angeforderten Inhalts.

PeerDistServerOpenContentInformation unterstützt das Generieren von Inhaltsinformationen für eine Bereichsanforderung über die Parameter ullContentOffset und cbContentLength . Der Parameter ullContentOffset stellt den Offset im ursprünglichen Inhalt dar, in dem der Bereich beginnt, und cbContentLength stellt die Länge des Bereichs dar.

Sobald ein Client Inhaltsinformationen abgerufen hat, die einen bestimmten Inhaltsbereich darstellen, funktionieren diese Inhaltsinformationen nahtlos mit den APIs PeerDistClientOpenContent, PeerDistClientAddContentInformation und PeerDistClientCompleteContentInformation . Die Inhaltsinformationen können an PeerDistServerOpenContentInformation übergeben werden und ordnen die PEERDIST_CONTENT_HANDLE dem Inhaltsbereich zu. PeerDistClientStreamRead wird durch den ullContentOffset-Offset und die Länge cbContentLength eingeschränkt, die im serverseitigen Aufruf von PeerDistServerRetrieveContentInformation angegeben sind. PeerDistClientStreamRead beginnt bei ullContentOffset und wird mit dem Fehlercode abgeschlossen , der PEERDIST_ERROR_NO_MORE , wenn das Ende des Inhaltsbereichs bei ullContentOffset + cbContentLength erreicht wird. PeerDistClientBlockRead wird mit dem Fehlercode PEERDIST_ERROR_NO_MORE abgeschlossen, wenn der im OVERLAPPED-Parameter angegebene Offset kleiner als ullContentOffset oder größer als ullContentOffset + cbContentLength ist. PeerDistClientStreamRead und PeerDistClientBlockRead begrenzen die Menge fehlender Daten, die an den Inhaltsbereich gemeldet werden, der in den Inhaltsinformationen angegeben ist, die dem PEERDIST_CONTENT_HANDLE zugeordnet sind. Wenn die Inhaltsinformationen beispielsweise nur die erste Hälfte des Inhalts darstellen, sind fehlende Daten auf die erste Hälfte des Inhalts beschränkt. In allen anderen Aspekten arbeiten PeerDistClientBlockRead und PeerDistClientStreamRead mit Inhaltsbereichen genau so, wie sie mit dem Inhalt als Ganzes arbeiten.

Ein Client kann PeerDistClientStreamRead oder PeerDistClientBlockRead verwenden, um den Inhalt aus dem vom ullContentOffset angegebenen Offset auf die länge abzurufen, die von cbContentLength im PeerDistServerRetrieveContentInformation-Aufruf angegeben wurde. Sowohl PeerDistClientStreamRead als auch PeerDistClientBlockRead werden mit PEERDIST_ERROR_NO_MORE abgeschlossen, wenn der Client versucht, über den von ullContentOffset und cbContentLength angegebenen Bereich hinaus zu lesen. Darüber hinaus wird PeerDistClientBlockRead auch mit dem Fehlercode PEERDIST_ERROR_NO_MORE abgeschlossen, wenn der im OVERLAPPED-Parameter angegebene Offset kleiner als ullContentOffset ist.

Wenn der Lesevorgang nicht über den lokalen Cache oder den Peercache abgeschlossen werden kann, melden PeerDistClientStreamRead und PeerDistClientBlockReadPEERDIST_ERROR_MISSING_DATA. Bei Verwendung der Bereichsinhaltsinformationen meldet PeerDistClientStreamRead fehlende Daten vom Startoffset des Bereichs bis zum Ende des Bereichs. PeerDistClientBlockRead meldet fehlende Daten vom Startoffset des Bereichs bis zum Ende des Bereichs.

PeerDistClientAddData ermöglicht das Hinzufügen von Inhaltsdaten, auch wenn sie außerhalb des Inhaltsbereichs liegen. Diese erweiterten Daten werden überprüft, nachdem die entsprechenden Inhaltsinformationen dem lokalen Cache hinzugefügt wurden. Nach der Überprüfung wird es für Peers verfügbar. Anders ausgedrückt: Wenn ein Client nur Inhaltsinformationen für die erste Hälfte des Inhalts hinzufügt, ermöglicht PeerDistClientAddData dem Client weiterhin das Hinzufügen von Daten für den gesamten Inhalt. Die zweite Hälfte des Inhalts wird jedoch erst überprüft, wenn die entsprechenden Inhaltsinformationen für die zweite Hälfte hinzugefügt wurden. Keine anderen Peerverteilungs-APIs sind von Bereichsanforderungen betroffen.

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Windows 7 Professional [nur Desktop-Apps]
Unterstützte Mindestversion (Server) Windows Server 2008 R2 [nur Desktop-Apps]
Zielplattform Windows
Kopfzeile peerdist.h
Bibliothek PeerDist.lib
DLL PeerDist.dll

Weitere Informationen

PeerDistClientAddContentInformation

PeerDistClientCloseContent

PeerDistClientOpenContent

PeerDistServerOpenContentInformation

PeerDistStartup