Endpunkte finden
Serverprogramme lauschen auf Endpunkte auf Clientanforderungen. Die Syntax der Endpunktzeichenfolge hängt von der verwendeten Protokollsequenz ab. Beispielsweise ist der Endpunkt für TCP/IP eine Portnummer, und die Endpunktsyntax für Named Pipes ist ein gültiger Pipename.
Es gibt zwei Arten von Endpunkten: bekannte und dynamische Endpunkte. Ob die verteilte Anwendung oder die Laufzeitbibliothek den Endpunkt angibt, hängt von Ihrer Wahl ab, welcher Endpunkt von Ihrem Programm verwendet wird.
In diesem Abschnitt werden Endpunkte erläutert und Informationen zu deren Suche beschrieben. Es ist in den folgenden Themen organisiert:
- Verwenden Well-Known Endpunkte
- Verwenden dynamischer Endpunkte
- Exportieren Well-Known Endpunkte in die Endpunktzuordnungsdatenbank
Hinweis
Die Begriffe statische Endpunkte und bekannte Endpunkte sind gleichwertig und werden austauschbar verwendet.
Es ist möglich, dass Ihre Clientanwendung die Endpunktzuordnung verwendet, um zu bestimmen, ob ein Serverprogramm derzeit ausgeführt wird oder nicht. Ihr Client kann RpcMgmtInqIfIds, RpcMgmtEpEltInqBegin und RpcMgmtEpEltInqDone aufrufen, um festzustellen, ob der Server die bestimmte Schnittstelle registriert hat, die er in der Endpunktzuordnung benötigt.
Verwenden bekannter Endpunkte
Bekannte Endpunkte sind vorab zugewiesene Endpunkte, die das Serverprogramm bei jeder Ausführung verwendet. Da der Server immer auf diesen bestimmten Endpunkt lauscht, versucht der Client immer, eine Verbindung mit diesem herzustellen. Bekannte Endpunkte werden in der Regel von der für das Transportprotokoll zuständigen Behörde zugewiesen. Da Serverhostcomputer über eine begrenzte Anzahl verfügbarer Endpunkte verfügen, wird Anwendungsentwicklern dringend davon abgeraten, bekannte Endpunkte zu verwenden. Ein weiterer Vorteil dynamischer Endpunkte ist, dass sie die langfristige Verwaltung und Wartung des Systems vereinfachen.
Eine verteilte Anwendung kann einen bekannten Endpunkt in einer Zeichenfolge angeben und diese Zeichenfolge als Parameter an die Funktion RpcServerUseProtseqEp übergeben. Alternativ kann die Endpunktzeichenfolge im IDL-Dateischnittstellenheader als Teil des [ endpunkt]-Schnittstellenattributes angezeigt werden.
Sie können zwei Ansätze verwenden, um den bekannten Endpunkt zu implementieren:
- Angeben aller Informationen in einer Zeichenfolgenbindung
- Speichern des bekannten Endpunkts in der Namensdienstdatenbank
Sie können alle Informationen schreiben, die zum Einrichten einer Bindung in eine verteilte Anwendung erforderlich sind, wenn Sie sie entwickeln. Der Client kann den bekannten Endpunkt direkt in einer Zeichenfolge angeben, RpcStringBindingCompose aufrufen, um eine Zeichenfolge zu erstellen, die alle Bindungsinformationen enthält, und diese Zeichenfolge an die Funktion RpcBindingFromStringBinding bereitstellen, um ein Handle abzurufen. Client und Server können hartcodiert sein, um einen bekannten Endpunkt zu verwenden, oder geschrieben werden, sodass die Endpunktinformationen von der Befehlszeile, einer Datendatei, einer Konfigurationsdatei oder der IDL-Datei stammen.
Ihre Clientanwendung kann auch eine Namensdienstdatenbank nach bekannten Endpunktinformationen abfragen.
Verwenden dynamischer Endpunkte
Die Anzahl der Endpunkte für einen bestimmten Server und eine bestimmte Protokollsequenz ist in der Regel begrenzt. Wenn Sie beispielsweise die ncacn_ip_tcp Protokollsequenz verwenden, die angibt, dass die RPC-Netzwerkkommunikation über TCP/IP erfolgt, ist nur eine begrenzte Anzahl von Ports verfügbar (die meisten Systeme haben nur den Bereich 1025 bis 5000 geöffnet). Mit den RPC-Laufzeitbibliotheken können Sie Endpunkte bei Bedarf dynamisch zuweisen. Da die Anzahl der möglichen Schnittstellen-UUIDs praktisch unbegrenzt ist, bietet die Verwendung der Schnittstellen-UUID zum Leiten des Anrufs mehr Raum für Erweiterung und mehr Flexibilität.
Standardmäßig suchen die RPC-Laufzeitbibliotheksfunktionen nach Endpunktinformationen, wenn sie eine Namensdienstdatenbank abfragen. Wenn der Endpunkt dynamisch ist, enthält die Namensdienstdatenbank keine Endpunktinformationen. Die Abfrage gibt Ihrem Clientprogramm jedoch den Namen eines Servers. Anschließend kann die Endpunktzuordnung des Servers durchsucht werden.
Wenn der Client einen Remoteprozeduraufruf mithilfe eines dynamischen Endpunkts ausführen muss, ist der Aufruf eines teilweise gebundenen Bindungshandles die bevorzugte Methode. Die RPC-Laufzeit löst den Endpunkt transparent auf. Diese Methode ist der Verwendung der RpcEpResolveBinding-Funktion überlegen, da sie erweiterte Zwischenspeicherungsmechanismen in der RPC-Laufzeit ermöglicht.
Wenn eine spezifischere Kontrolle über die Endpunktauswahl erforderlich ist, können Clients die Endpunktzuordnung jeweils nach einem Eintrag durchsuchen, indem sie die Funktionen RpcMgmtEpEltInqBegin, RpcMgmtEpEltInqNext und RpcMgmtEpEltInqDone aufrufen.
Exportieren bekannter Endpunkte in die Endpunktzuordnungsdatenbank
Es ist möglich, die beiden Ansätze zum Ermitteln von Endpunkten zu kombinieren, insbesondere wenn ein verteiltes System von einem bekannten Endpunktmodell zu einem dynamischen Endpunktmodell überwechselt. Bei solchen Übergängen verwendet eine Zwischenversion des Servers einen bekannten Endpunkt, registriert aber auch den bekannten Endpunkt bei der Endpunktzuordnungsdatenbank. Dieser Ansatz ermöglicht Clients, die bekannte Endpunkte verwenden, und Clients, die einen dynamischen Endpunkt verwenden, um eine Verbindung herzustellen. Sobald alle Server aktualisiert wurden, kann eine neue Clientversion bereitgestellt werden, die nur dynamische Endpunkte verwendet. Sobald alle Clients aktualisiert wurden, kann eine endgültige Serverversion die Verwendung bekannter Endpunkte beenden und nur dynamische Endpunkte verwenden.
Dieser Ansatz ermöglicht einen Übergangspfad für Anwendungen, die mit einem bekannten Endpunkt begonnen haben, aber zu einem dynamischen Endpunkt migrieren möchten, ohne dass eine gleichzeitige Aktualisierung aller Server und Clients erforderlich ist.