Share via


LPFN_RIOSENDEX Rückruffunktion (mswsock.h)

Die RIOSendEx-Funktion sendet Netzwerkdaten auf einem verbundenen registrierten E/A-TCP-Socket oder einem gebundenen registrierten E/A-UDP-Socket mit zusätzlichen Optionen für die Verwendung mit den registrierten Winsock-E/A-Erweiterungen.

Syntax

LPFN_RIOSENDEX LpfnRiosendex;

BOOL LpfnRiosendex(
  RIO_RQ SocketQueue,
  PRIO_BUF pData,
  ULONG DataBufferCount,
  PRIO_BUF pLocalAddress,
  PRIO_BUF pRemoteAddress,
  PRIO_BUF pControlContext,
  PRIO_BUF pFlags,
  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

Ein Puffersegment aus einem registrierten Puffer, aus dem Daten gesendet werden sollen. Die RIO_BUF Struktur, auf die dieser Parameter verweist, kann einen Teil eines registrierten Puffers oder einen vollständig registrierten Puffer darstellen.

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.

pLocalAddress

Dieser Parameter ist reserviert und muss NULL sein.

pRemoteAddress

Ein Puffersegment aus einem registrierten Puffer, der bei der Eingabe die Remoteadresse enthält, an die die Netzwerkdaten gesendet werden sollen.

Dieser Parameter kann NULL sein, wenn der Socket verbunden ist.

pControlContext

Ein Pufferslice, der nach Abschluss zusätzliche Steuerungsinformationen zum Sendevorgang enthält.

Dieser Parameter kann NULL sein, wenn die Anwendung die zusätzlichen Steuerelementinformationen nicht erhalten möchte.

pFlags

Ein Pufferslice, der nach Abschluss zusätzliche Informationen zu den Flags für den Sendevorgang enthält.

Dieser Parameter kann NULL sein, wenn die Anwendung die zusätzlichen Flaginformationen nicht empfangen möchte.

Flags

Ein Satz von Flags, die das Verhalten der RIOSendEx-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 committet.

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

Dieses Flag wird in der Regel gelegentlich verwendet, nachdem eine Reihe von Anforderungen mit festgelegtem RIO_MSG_DEFER-Flag ausgegeben wurde. Dadurch entfällt die Notwendigkeit, wenn sie das RIO_MSG_DEFER-Flag verwenden, um die letzte Anforderung ohne das RIO_MSG_DEFER-Flag auszuführen, was dazu führt, dass die letzte Anforderung viel langsamer abgeschlossen wird als andere Anforderungen.

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

RIO_MSG_DONT_NOTIFY

Die Anforderung sollte die RIONotify-Funktion nicht auslösen, wenn der Abschluss der Anforderung 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 gestellt wird, die im SocketQueue-Parameter übergeben wird, ohne dass das flag RIO_MSG_DEFER 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 flag RIO_MSG_DEFER festgelegt ist.

Hinweis

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

RequestContext

Der Anforderungskontext, der diesem Sendevorgang zugeordnet werden soll.

Rückgabewert

Wenn kein Fehler auftritt, gibt die RIOSendEx-FunktionTRUE zurück. In diesem Fall wird der Sendevorgang erfolgreich initiiert, und der Abschluss wurde bereits in die Warteschlange gestellt, oder der Vorgang wurde erfolgreich initiiert, und der Abschluss 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 Abschlussanzeige in die Warteschlange eingereiht 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 die Registrierung eines Pufferbezeichners aufgehoben oder ein Puffer für eine der RIO_BUF Strukturen freigegeben wird, die in Parametern übergeben werden, bevor der Vorgang in die Warteschlange eingereiht 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 ungültig ist oder die Integrität der Abschlusswarteschlange gefährdet wurde. Dieser Fehler kann auch für andere Probleme mit Parametern zurückgegeben werden.
WSAENOBUFS Es konnte kein ausreichender Arbeitsspeicher zugewiesen werden. Dieser Fehler wird zurückgegeben, wenn die E/A-Vervollständigungswarteschlange, die dem SocketQueue-Parameter zugeordnet ist, voll ist oder die E/A-Vervollständigungswarteschlange mit null Sendeeinträgen erstellt wurde.
WSA_IO_PENDING Der Vorgang wurde erfolgreich initiiert, und der Abschluss wird zu einem späteren Zeitpunkt in die Warteschlange gestellt.

Hinweise

Eine Anwendung kann die RIOSendEx-Funktion verwenden, um Netzwerkdaten aus einem 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 vom 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 nicht dieselbe PRIO_BUF an eine RIOSend(Ex)-Anforderung übergeben sollten, wenn eine bereits aussteht. Erst nach Abschluss einer RIOSend(Ex)-Anforderung während des Flugs sollten Sie die gleiche PRIO_BUF erneut verwenden (entweder mit demselben Offset oder mit einem anderen Offset und einer anderen Länge). Wenn Sendedaten auf einen registrierten Puffer (entweder einen Teil oder den gesamten Puffer) verweisen, 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 Parameter pLocalAddress kann verwendet werden, um die lokale Adresse abzurufen, von der die Daten gesendet wurden. Der Parameter pRemoteAddress kann verwendet werden, um die Remoteadresse abzurufen, an die die Daten gesendet wurden. Die lokalen und Remoteadressen werden als SOCKADDR_INET-Strukturen zurückgegeben. Daher sollte der Length-Member des RIO_BUF , auf den die Parameter pLocalAddress oder pRemoteAddress verweisen, gleich oder größer sein als die Größe einer SOCKADDR_INET-Struktur .

In der folgenden Tabelle sind die verschiedenen Verwendungen von Steuerelementdaten zusammengefasst, die für die Verwendung mit den Steuerelementinformationen im pControlContext-Member verfügbar sind.

Protocol cmsg_level cmsg_type BESCHREIBUNG
IPv4 IPPROTO_IP IP_PKTINFO Gibt Paketinformationen an/empfängt sie.
Weitere Informationen finden Sie unter IPPROTO_IP Socketoptionen für die Socketoption IP_PKTINFO.
IPv6 IPPROTO_IPV6 IPV6_DSTOPTS Gibt Zieloptionen an/empfängt sie.
IPv6 IPPROTO_IPV6 IPV6_HOPLIMIT Gibt das Hoplimit an/empfängt.
Weitere Informationen finden Sie unter IPPROTO_IPV6 Socketoptionen für die Socketoption IPV6_HOPLIMIT.
IPv6 IPPROTO_IPV6 IPV6_HOPOPTS Gibt Optionen für Hop-by-Hop an/empfängt sie.
IPv6 IPPROTO_IPV6 IPV6_NEXTHOP Gibt die Adresse des nächsten Hops an.
IPv6 IPPROTO_IPV6 IPV6_PKTINFO Gibt Paketinformationen an/empfängt sie.
Weitere Informationen finden Sie unter IPPROTO_IPV6 Socketoptionen für die Socketoption IPV6_PKTINFO.
IPv6 IPPROTO_IPV6 IPV6_RTHDR Gibt den Routingheader an/empfängt.

Steuerelementdaten bestehen aus einem oder mehreren Steuerelementdatenobjekten, die jeweils mit einer WSACMSGHDR-Struktur beginnen, die wie folgt definiert ist:

} WSACMSGHDR;

Die Elemente der WSACMSGHDR-Struktur sind wie folgt:

Begriff BESCHREIBUNG
cmsg_len Die Anzahl der Bytes der Daten, die vom Anfang des WSACMSGHDR bis zum Ende der Daten beginnen (mit Ausnahme der Auffüllung von Bytes, die auf Daten folgen können).
cmsg_level Das Protokoll, aus dem die Steuerelementinformationen stammen.
cmsg_type Der protokollspezifische Typ von Steuerelementinformationen.

Der Flags-Parameter kann verwendet werden, um das Verhalten der RIOSendEx-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 RIOSendEx-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 Ws2def.h-Headerdatei 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 ab Windows Phone 8 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