LPFN_RIOSEND Rückruffunktion (mswsock.h)

Die RIOSend-Funktion sendet Netzwerkdaten auf einem verbundenen registrierten E/A-TCP-Socket oder einem gebundenen registrierten E/A-UDP-Socket zur Verwendung mit den registrierten Winsock-E/A-Erweiterungen.

Syntax

LPFN_RIOSEND LpfnRiosend;

BOOL LpfnRiosend(
  RIO_RQ SocketQueue,
  PRIO_BUF pData,
  ULONG DataBufferCount,
  DWORD Flags,
  PVOID RequestContext
)
{...}

Parameter

SocketQueue

Ein Deskriptor, der einen verbundenen registrierten E/A-TCP-Socket oder einen gebundenen registrierten E/A-UDP-Socket identifiziert.

pData

Eine Beschreibung des Teils des registrierten Puffers, aus dem Daten gesendet werden sollen.

Dieser Parameter kann NULL für einen gebundenen registrierten E/A-UDP-Socket sein, wenn die Anwendung keine Datennutzlast im UDP-Datagramm senden muss.

DataBufferCount

Ein Datenpufferanzahlparameter, der angibt, ob Daten im Puffer gesendet werden sollen, auf den der pData-Parameter verweist.

Dieser Parameter sollte auf Null festgelegt werden, wenn pData NULL ist. Andernfalls sollte dieser Parameter auf 1 festgelegt werden.

Flags

Eine Reihe von Flags, die das Verhalten der RIOSend-Funktion ändern.

Der Flags-Parameter kann eine Kombination der folgenden Optionen enthalten, die in der Mswsockdef.h Headerdatei definiert sind:

RIO_MSG_COMMIT_ONLY

Vorherige Anforderungen, die mit RIO_MSG_DEFER Flag hinzugefügt wurden, werden zu einem Commit ausgeführt.

Wenn das RIO_MSG_COMMIT_ONLY-Flag festgelegt ist, können keine anderen Flags angegeben werden. Wenn das RIO_MSG_COMMIT_ONLY-Flag festgelegt ist, müssen die pData - und RequestContext-Argumente NULL und das DataBufferCount-Argument null sein.

Dieses Flag wird normalerweise gelegentlich verwendet, nachdem eine Reihe von Anforderungen mit dem RIO_MSG_DEFER-Flag festgelegt wurde. Dadurch entfällt die Notwendigkeit, beim Verwenden des RIO_MSG_DEFER-Flags die letzte Anforderung ohne das RIO_MSG_DEFER-Flag zu stellen, was dazu führt, dass die letzte Anforderung viel langsamer abgeschlossen wird als andere Anforderungen.

Im Gegensatz zu anderen Aufrufen der RIOSend-Funktion müssen Aufrufe der RIOSend-Funktion beim Festlegen des RIO_MSG_COMMIT_ONLY-Flags nicht serialisiert werden. Für eine einzelne RIO_RQ kann die RIOSend-Funktion mit RIO_MSG_COMMIT_ONLY in einem Thread aufgerufen werden, während die RIOSend-Funktion in einem anderen Thread aufgerufen wird.

RIO_MSG_DONT_NOTIFY

Die Anforderung sollte die RIONotify-Funktion nicht auslösen, wenn der Anforderungsabschluss in die Vervollständigungswarteschlange eingefügt wird.

RIO_MSG_DEFER

Die Anforderung muss nicht sofort ausgeführt werden. Dadurch wird die Anforderung in die Anforderungswarteschlange eingefügt, aber möglicherweise wird die Ausführung der Anforderung ausgelöst.

Das Senden von Daten kann verzögert werden, bis eine Sendeanforderung für die RIO_RQ im SocketQueue-Parameter übergeben wird, ohne dass das RIO_MSG_DEFER-Flag festgelegt ist. Um die Ausführung für alle Senden in einer Sendewarteschlange auszulösen, rufen Sie die RIOSend - oder RIOSendEx-Funktion auf, ohne dass das RIO_MSG_DEFER-Flag festgelegt ist.

Hinweis

Die Sendeanforderung wird mit der ausstehenden E/A-Kapazität auf der RIO_RQ berechnet, die im SocketQueue-Parameter übergeben wird, unabhängig davon, ob RIO_MSG_DEFER festgelegt ist.

RequestContext

Rückgabewert

Wenn kein Fehler auftritt, gibt die RIOSend-FunktionTRUE zurück. In diesem Fall wird der Sendevorgang erfolgreich initiiert, und die Vervollständigung wurde bereits in die Warteschlange gestellt, oder der Vorgang wurde erfolgreich initiiert, und die Vervollständigung wird zu einem späteren Zeitpunkt in die Warteschlange gestellt.

Der Wert FALSE gibt an, dass die Funktion fehlgeschlagen ist, der Vorgang nicht erfolgreich initiiert wurde und keine Vervollständigungsanzeige in die Warteschlange gestellt wird. Ein bestimmter Fehlercode kann durch Aufrufen der WSAGetLastError-Funktion abgerufen werden.

Rückgabecode Beschreibung
WSAEFAULT Das System hat beim Versuch, ein Zeigerargument in einem Aufruf zu verwenden, eine ungültige Zeigeradresse erkannt. Dieser Fehler wird zurückgegeben, wenn ein Pufferbezeichner für eine der RIO_BUF Strukturen freigegeben wird, die in Parametern übergeben werden, bevor der Vorgang in die Warteschlange gestellt oder aufgerufen wird.
WSAEINVAL Es wurde ein ungültiger Parameter an die Funktion übergeben.
Dieser Fehler wird zurückgegeben, wenn der SocketQueue-Parameter ungültig ist, der Flags-Parameter einen Wert enthält, der für einen Sendevorgang nicht gültig ist oder die Integrität der Vervollständigungswarteschlange gefährdet wurde. Dieser Fehler kann auch für andere Probleme mit Parametern zurückgegeben werden.
WSAENOBUFS Es konnte nicht genügend Arbeitsspeicher zugewiesen werden. Dieser Fehler wird zurückgegeben, wenn die E/A-Vervollständigungswarteschlange, die dem SocketQueue-Parameter zugeordnet ist, voll ist oder wenn die E/A-Vervollständigungswarteschlange mit null Sendeeinträgen erstellt wurde.
WSA_IO_PENDING Der Vorgang wurde erfolgreich initiiert, und die Vervollständigung wird zu einem späteren Zeitpunkt in die Warteschlange gestellt.

Hinweise

Eine Anwendung kann die RIOSend-Funktion verwenden, um Netzwerkdaten aus einem beliebigen Puffer zu senden, der vollständig in einem einzelnen registrierten Puffer enthalten ist. Die Elemente Offset und Length der RIO_BUF Struktur, auf die der pData-Parameter verweist, bestimmen die Netzwerkdaten, die aus dem Puffer gesendet werden sollen.

Der einem Sendevorgang zugeordnete Puffer darf nicht gleichzeitig mit einem anderen Sende- oder Empfangsvorgang verwendet werden. Der Puffer und die Pufferregistrierung müssen für die Dauer eines Sendevorgangs gültig bleiben. Dies bedeutet, dass Sie denselben PRIO_BUF nicht an eine RIOSend(Ex)-Anforderung übergeben sollten, wenn eine bereits aussteht. Erst nachdem eine RIOSend(Ex)-Anforderung während des Flugs abgeschlossen ist, sollten Sie dieselbe PRIO_BUF erneut verwenden (entweder mit demselben Offset oder mit einem anderen Offset und einer anderen Länge). Wenn Sendedaten auf einen registrierten Puffer verweisen (entweder einen Teil oder den gesamten Puffer), darf der gesamte registrierte Puffer erst verwendet werden, wenn der Sendevorgang abgeschlossen ist. Dies schließt die Verwendung eines Teils des registrierten Puffers für einen Empfangsvorgang oder einen anderen Sendevorgang ein.

Der Flags-Parameter kann verwendet werden, um das Verhalten der RIOSend-Funktion über die für den zugeordneten Socket angegebenen Optionen hinaus zu beeinflussen. Das Verhalten dieser Funktion wird durch eine Kombination aller Socketoptionen bestimmt, die für den Socket festgelegt sind, der dem SocketQueue-Parameter zugeordnet ist, und den im Flags-Parameter angegebenen Werten.

Hinweis

Der Funktionszeiger auf die RIOSend-Funktion muss zur Laufzeit abgerufen werden, indem die WSAIoctl-Funktion mit dem angegebenen SIO_GET_MULTIPLE_EXTENSION_FUNCTION_POINTER opcode aufgerufen wird. Der an die WSAIoctl-Funktion übergebene Eingabepuffer muss WSAID_MULTIPLE_RIO enthalten, einen global eindeutigen Bezeichner (GUID), dessen Wert die von Winsock registrierten E/A-Erweiterungsfunktionen identifiziert. Bei Erfolg enthält die von der WSAIoctl-Funktion zurückgegebene Ausgabe einen Zeiger auf die RIO_EXTENSION_FUNCTION_TABLE-Struktur , die Zeiger auf die von Winsock registrierten E/A-Erweiterungsfunktionen enthält. Die SIO_GET_MULTIPLE_EXTENSION_FUNCTION_POINTER IOCTL ist in der Headerdatei Ws2def.h definiert. Die WSAID_MULTIPLE_RIO GUID ist in der Headerdatei "Mswsock.h " definiert.

Windows Phone 8: Diese Funktion wird für Windows Phone Store-Apps auf Windows Phone 8 und höher unterstützt.

Windows 8.1 und Windows Server 2012 R2: Diese Funktion wird für Windows Store-Apps auf Windows 8.1, Windows Server 2012 R2 und höher unterstützt.

Anforderungen

Anforderung Wert
Header mswsock.h