SIO_ASSOCIATE_PORT_RESERVATION-Steuerelementcode
BESCHREIBUNG
Der SIO_ASSOCIATE_PORT_RESERVATION-Steuerungscode ordnet einen Socket einer persistenten oder Laufzeitreservierung für einen TCP- oder UDP-Block zu, der durch das Portreservierungstoken identifiziert wird. Diese IOCTL muss ausgestellt werden, bevor der Socket gebunden wird. Wenn und wenn der Socket gebunden ist, wird der ihm zugewiesene Port aus der Portreservierung ausgewählt, die durch das angegebene Token identifiziert wird. Wenn keine Ports aus der angegebenen Reservierung verfügbar sind, schlägt der Aufruf der Bindungsfunktion fehl.
Um diesen Vorgang auszuführen, rufen Sie die Funktion WSAIoctl oder WSPIoctl mit den folgenden Parametern auf.
int WSAIoctl(
(socket) s, // descriptor identifying a socket
SIO_ASSOCIATE_PORT_RESERVATION, // dwIoControlCode
(LPVOID) lpvInBuffer, // pointer to an INET_PORT_RESERVATION_TOKEN
(DWORD) cbInBuffer, // size, in bytes, of the input buffer
NULL, // lpvOutBuffer is a pointer to the output buffer
0, // cbOutBuffer is the size, in bytes, of the output buffer
(LPDWORD) lpcbBytesReturned, // number of bytes returned
(LPWSAOVERLAPPED) lpOverlapped, // OVERLAPPED structure
(LPWSAOVERLAPPED_COMPLETION_ROUTINE) lpCompletionRoutine, // completion routine
);
int WSPIoctl(
(socket) s, // descriptor identifying a socket
SIO_ASSOCIATE_PORT_RESERVATION, // dwIoControlCode
(LPVOID) lpvInBuffer, // pointer to an INET_PORT_RESERVATION_TOKEN
(DWORD) cbInBuffer, // size, in bytes, of the input buffer
NULL, // lpvOutBuffer is a pointer to the output buffer
0, // cbOutBuffer is the size, in bytes, of the output buffer
(LPDWORD) lpcbBytesReturned, // number of bytes returned
(LPWSAOVERLAPPED) lpOverlapped, // OVERLAPPED structure
(LPWSAOVERLAPPED_COMPLETION_ROUTINE) lpCompletionRoutine, // completion routine
(LPWSATHREADID) lpThreadId, // a WSATHREADID structure
(LPINT) lpErrno // a pointer to the error code.
);
Parameter
s
Ein Deskriptor, der einen Socket identifiziert.
dwIoControlCode
Der Steuerelementcode für den Vorgang. Verwenden Sie für diesen Vorgang SIO_ASSOCIATE_PORT_RESERVATION .
lpvInBuffer
Ein Zeiger auf den Eingabepuffer. Dieser Parameter enthält einen Zeiger auf eine INET_PORT_RESERVATION_TOKEN-Struktur mit dem Token für die TCP- oder UDP-Portreservierung, die dem Socket zugeordnet werden soll.
cbInBuffer
Die Größe des Eingabepuffers in Bytes. Dieser Parameter muss mindestens die Größe der INET_PORT_RESERVATION_TOKEN-Struktur aufweisen.
lpvOutBuffer
Ein Zeiger auf den Ausgabepuffer. Dieser Parameter wird für diesen Vorgang nicht verwendet.
cbOutBuffer
Die Größe des Ausgabepuffers in Bytes. Dieser Parameter muss auf 0 festgelegt werden.
lpcbBytesReturned
Ein Zeiger auf eine Variable, die die Größe der im Ausgabepuffer gespeicherten Daten in Bytes empfängt.
Wenn der Ausgabepuffer zu klein ist, schlägt der Aufruf fehl, WSAGetLastError gibt WSAEINVAL zurück, und der parameter lpcbBytesReturned verweist auf den DWORD-Wert 0.
Wenn lpOverlappedNULL ist, kann der DWORD-Wert , auf den der lpcbBytesReturned-Parameter verweist, der bei einem erfolgreichen Aufruf zurückgegeben wird, nicht null sein.
Wenn der lpOverlapped-Parameter für überlappende Sockets nicht NULL ist, werden Vorgänge initiiert, die nicht sofort abgeschlossen werden können, und der Abschluss wird zu einem späteren Zeitpunkt angezeigt. Der DWORD-Wert , auf den der zurückgegebene Parameter lpcbBytesReturned verweist, kann null sein, da die Größe der gespeicherten Daten erst bestimmt werden kann, wenn der überlappende Vorgang abgeschlossen ist. Der endgültige Abschluss status kann abgerufen werden, wenn die entsprechende Vervollständigungsmethode signalisiert wird, wenn der Vorgang abgeschlossen ist.
lpvOverlapped
Ein Zeiger auf eine WSAOVERLAPPED-Struktur .
Wenn Socket s ohne das überlappende Attribut erstellt wurde, wird der lpOverlapped-Parameter ignoriert.
Wenn s mit dem überlappenden Attribut geöffnet wurde und der lpOverlapped-Parameter nicht NULL ist, wird der Vorgang als überlappender (asynchroner) Vorgang ausgeführt. In diesem Fall muss der lpOverlapped-Parameter auf eine gültige WSAOVERLAPPED-Struktur verweisen.
Bei überlappenden Vorgängen wird die WSAIoctl - oder WSPIoctl-Funktion sofort zurückgegeben, und die entsprechende Abschlussmethode wird nach Abschluss des Vorgangs signalisiert. Andernfalls wird die Funktion erst zurückgegeben, wenn der Vorgang abgeschlossen wurde oder ein Fehler auftritt.
lpCompletionRoutine
Typ: _In_opt_ LPWSAOVERLAPPED_COMPLETION_ROUTINE
Ein Zeiger auf die Abschlussroutine, die aufgerufen wird, wenn der Vorgang abgeschlossen wurde (bei nicht überlappenden Sockets ignoriert).
lpThreadId
Ein Zeiger auf eine WSATHREADID-Struktur , die vom Anbieter in einem nachfolgenden Aufruf von WPUQueueApc verwendet werden soll. Der Anbieter sollte die referenzierte WSATHREADID-Struktur (nicht den Zeiger auf dieselbe) speichern, bis die WPUQueueApc-Funktion zurückgegeben wird.
Hinweis Dieser Parameter gilt nur für die WSPIoctl-Funktion .
lpErrno
Ein Zeiger auf den Fehlercode.
Hinweis Dieser Parameter gilt nur für die WSPIoctl-Funktion .
Rückgabewert
Wenn der Vorgang erfolgreich abgeschlossen wird, gibt die WSAIoctl - oder WSPIoctl-Funktion null zurück.
Wenn der Vorgang fehlschlägt oder aussteht, gibt die WSAIoctl - oder WSPIoctl-FunktionSOCKET_ERROR zurück. Rufen Sie WSAGetLastError auf, um erweiterte Fehlerinformationen zu erhalten.
Fehlercode | Bedeutung |
---|---|
WSA_IO_PENDING | Überlappender E/A-Vorgang wird ausgeführt. Dieser Wert wird zurückgegeben, wenn ein überlappender Vorgang erfolgreich initiiert wurde und der Abschluss zu einem späteren Zeitpunkt angegeben wird. |
WSA_OPERATION_ABORTED | Der E/A-Vorgang wurde wegen eines Threadendes oder einer Anwendungsanforderung abgebrochen. Dieser Fehler wird zurückgegeben, wenn ein überlappender Vorgang aufgrund des Schließens des Sockets oder der Ausführung des SIO_FLUSH IOCTL-Befehls abgebrochen wurde. |
WSAEACCES | Es wurde versucht, auf einen Socket auf eine Weise zuzugreifen, die durch seine Zugriffsberechtigungen verboten ist. Dieser Fehler wird unter verschiedenen Bedingungen für persistente Portreservierungen zurückgegeben, die folgendes umfassen: Dem Benutzer fehlen die erforderlichen Administratorrechte auf dem lokalen Computer, oder die Anwendung wird nicht in einer erweiterten Shell als integrierter Administrator (RunAs administrator ) ausgeführt. |
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 Parameter lpvInBuffer, lpvoutBuffer, lpcbBytesReturned, lpOverlapped oder lpCompletionRoutine nicht vollständig in einem gültigen Teil des Benutzeradressraums enthalten sind. |
WSAEINPROGRESS | Ein Blockierungsvorgang wird momentan ausgeführt. Dieser Fehler wird zurückgegeben, wenn die Funktion aufgerufen wird, wenn ein Rückruf ausgeführt wird. |
WSAEINTR | Ein blockierender Vorgang wurde durch einen Aufruf von WSACancelBlockingCall unterbrochen. Dieser Fehler wird zurückgegeben, wenn ein blockierende Vorgang unterbrochen wurde. |
WSAEINVAL | Ein ungültiges Argument wurde angegeben. Dieser Fehler wird zurückgegeben, wenn der dwIoControlCode-Parameter kein gültiger Befehl ist, ein angegebener Eingabeparameter nicht akzeptabel ist oder der Befehl nicht auf den angegebenen Sockettyp anwendbar ist. |
WSAENETDOWN | Bei einem Socketvorgang war das Netzwerk inaktiv. Dieser Fehler wird zurückgegeben, wenn das Netzwerksubsystem fehlgeschlagen ist. |
WSAENOTSOCK | Ein Vorgang wurde für etwas versucht, das kein Socket ist. Dieser Fehler wird zurückgegeben, wenn der Deskriptor s kein Socket ist. |
WSAEOPNOTSUPP | Der versuchte Vorgang wird für den Typ des Objekts, auf das verwiesen wird, nicht unterstützt. Dieser Fehler wird zurückgegeben, wenn der angegebene IOCTL-Befehl nicht unterstützt wird. Dieser Fehler wird auch zurückgegeben, wenn die SIO_ASSOCIATE_PORT_RESERVATION IOCTL vom Transportanbieter nicht unterstützt wird. Dieser Fehler wird auch zurückgegeben, wenn versucht wird, die SIO_ASSOCIATE_PORT_RESERVATION IOCTL auf einem anderen Socket als UDP oder TCP zu verwenden. |
Bemerkungen
Die SIO_ASSOCIATE_PORT_RESERVATION IOCTL wird unter Windows Vista und höheren Versionen des Betriebssystems unterstützt.
Anwendungen und Dienste, die Ports reservieren müssen, fallen in zwei Kategorien. Die erste Kategorie umfasst Komponenten, die einen bestimmten Port als Teil ihres Betriebs benötigen. Solche Komponenten bevorzugen es in der Regel, ihren erforderlichen Port zur Installationszeit anzugeben (z. B. in einem Anwendungsmanifest). Die zweite Kategorie umfasst Komponenten, die zur Laufzeit einen verfügbaren Port oder Portblock benötigen. Diese beiden Kategorien entsprechen spezifischen Und Wildcard-Portreservierungsanforderungen. Bestimmte Reservierungsanforderungen können persistent oder runtime sein, während Reservierungsanforderungen für Wildcardports nur zur Laufzeit unterstützt werden.
Die SIO_ASSOCIATE_PORT_RESERVATION IOCTL wird verwendet, um eine TCP- oder UDP-Portreservierung einer persistenten oder Laufzeitreservierung zuzuordnen.
Die Funktion CreatePersistentTcpPortReservation oder CreatePersistentUdpPortReservation bietet einer Anwendung oder einem Dienst die Möglichkeit, einen persistenten Block von TCP- oder UDP-Ports zu reservieren. Reservierungen für persistente Ports werden in einem persistenten Speicher für das TCP- oder UDP-Modul in Windows aufgezeichnet. Beachten Sie, dass sich das Token für eine bestimmte permanente Portreservierung bei jedem Neustart des Systems ändern kann.
Sobald eine permanente TCP- oder UDP-Portreservierung abgerufen wurde, kann eine Anwendung Portzuweisungen von der Portreservierung anfordern, indem sie einen TCP- oder UDP-Socket öffnet und dann die WSAIoctl-Funktion aufruft, die den SIO_ASSOCIATE_PORT_RESERVATION IOCTL angibt und das Reservierungstoken übergibt, bevor ein Aufruf der Bindungsfunktion im Socket ausgegeben wird.
Die SIO_ACQUIRE_PORT_RESERVATION IOCTL kann verwendet werden, um eine Laufzeitreservierung für einen Block von TCP- oder UDP-Ports anzufordern. Für Laufzeitportreservierungen erfordert der Portpool, dass Reservierungen aus dem Prozess genutzt werden, für den die Reservierung gewährt wurde. Laufzeitportreservierungen dauern nur so lange wie die Lebensdauer des Sockets, für den die SIO_ACQUIRE_PORT_RESERVATION IOCTL aufgerufen wurde. Im Gegensatz dazu können persistente Portreservierungen, die mit der Funktion CreatePersistentTcpPortReservation oder CreatePersistentUdpPortReservation erstellt wurden, von jedem Prozess verwendet werden, der persistente Reservierungen abrufen kann.
Sobald eine Tcp- oder UDP-Portreservierung der Laufzeit abgerufen wurde, kann eine Anwendung Portzuweisungen von der Portreservierung anfordern, indem sie einen TCP- oder UDP-Socket öffnet und dann die WSAIoctl-Funktion aufruft, die den SIO_ASSOCIATE_PORT_RESERVATION IOCTL angibt und das Reservierungstoken übergibt, bevor ein Aufruf der Bindungsfunktion im Socket ausgegeben wird.
Wenn sowohl die Parameter lpOverlapped als auch lpCompletionRoutine NULL sind, wird der Socket in dieser Funktion als nicht überlappender Socket behandelt. Bei einem nicht überlappenden Socket werden die Parameter lpOverlapped und lpCompletionRoutine ignoriert, mit der Ausnahme, dass die Funktion blockieren kann, wenn sich Socket s im Blockierungsmodus befindet. Wenn sich Socket s im nicht blockierenden Modus befindet, wird diese Funktion weiterhin blockiert, da diese spezielle IOCTL den nicht blockierenden Modus nicht unterstützt.
Bei überlappenden Sockets werden Vorgänge initiiert, die nicht sofort abgeschlossen werden können, und die Vervollständigung wird zu einem späteren Zeitpunkt angezeigt.
Jede IOCTL kann je nach Implementierung des Dienstanbieters unbegrenzt blockiert werden. Wenn die Anwendung die Blockierung in einem WSAIoctl - oder WSPIoctl-Funktionsaufruf nicht tolerieren kann, werden überlappende E/A für IOCTLs empfohlen, die besonders wahrscheinlich blockiert werden.
Die SIO_ASSOCIATE_PORT_RESERVATION IOCTL kann mit WSAEINTR oder WSA_OPERATION_ABORTED in den folgenden Fällen fehlschlagen:
- Die Anforderung wird vom E/A-Manager abgebrochen.
- Der Socket ist geschlossen.
Die SIO_ASSOCIATE_PORT_RESERVATION IOCTL, die an die Funktion WSAIoctl oder WSPIoctl für eine persistente Portreservierung übergeben wurde, kann nur in einer Anwendung verwendet werden, wenn der Benutzer als Mitglied der Gruppe Administratoren angemeldet ist.
Wenn SIO_ASSOCIATE_PORT_RESERVATION IOCTL in einer Anwendung verwendet wird, wenn der Benutzer kein Mitglied der Gruppe Administratoren ist, schlägt der Funktionsaufruf fehl, und WSAEACCES wird zurückgegeben.
Die Verwendung der SIO_ASSOCIATE_PORT_RESERVATION IOCTL kann auch aufgrund der Benutzerkontensteuerung (User Account Control, UAC) unter Windows Vista und höher fehlschlagen.
Wenn eine Anwendung, die diese IOCTL mit einer persistenten Portreservierung verwendet, von einem Benutzer ausgeführt wird, der sich als Mitglied der Gruppe Administratoren als der integrierte Administrator angemeldet hat, tritt bei diesem Aufruf ein Fehler auf, es sei denn, die Anwendung wurde in der Manifestdatei mit einem requestedExecutionLevel-Satz für requireAdministrator markiert.
Wenn der Anwendung diese Manifestdatei fehlt, muss ein Benutzer, der sich nicht als der integrierte Administrator als Mitglied der Administratorgruppe angemeldet hat, die Anwendung in einer erweiterten Shell als integrierter Administrator (RunAs administrator
) ausführen, damit diese Funktion erfolgreich ist.
Siehe auch
CreatePersistentTcpPortReservation
CreatePersistentUdpPortReservation
DeletePersistentTcpPortReservation
DeletePersistentUdpPortReservation
LookupPersistentTcpPortReservation