Freigeben über


Suchen nach Serverhostsystemen

Ein Serverhostsystem ist der Computer, der das Serverprogramm der verteilten Anwendung ausführt. Es kann ein oder mehrere Serverhostsysteme in einem Netzwerk geben. Wie Ihr Clientprogramm einen Server findet, mit dem eine Verbindung hergestellt werden soll, hängt von den Anforderungen Ihres Programms ab.

Es gibt zwei Methoden zum Ermitteln von Serverhostsystemen:

  • Verwenden von Informationen, die in Zeichenfolgen im Clientquellcode, Umgebungsvariablen oder anwendungsspezifischen Konfigurationsdateien gespeichert sind. Ihre Clientanwendung kann die Daten in der Zeichenfolge verwenden, um eine Bindung zwischen dem Client und dem Server zu erstellen.
  • Abfragen einer Namensdienstdatenbank nach dem Speicherort eines Serverprogramms.

In diesem Abschnitt finden Sie Informationen zu diesen beiden Techniken in den folgenden Themen:

Verwenden von Zeichenfolgenbindungen

Anwendungen können Bindungen aus in Zeichenfolgen gespeicherten Informationen erstellen. Ihre Clientanwendung erstellt diese Informationen als Zeichenfolge und ruft dann die RpcBindingFromStringBinding-Funktion auf . Der Client muss die folgenden Informationen bereitstellen, um den Server zu identifizieren:

(Die Objekt-UUID und die Endpunktinformationen sind optional.)

In den folgenden Beispielen enthalten der Parameter pszNetworkAddress und andere Parameter eingebettete umgekehrte Schrägstriche. Der umgekehrte Schrägstrich ist ein Escapezeichen in der Programmiersprache C. Zwei umgekehrte Schrägstriche sind erforderlich, um jedes einzelne literale umgekehrte Schrägstrichzeichen darzustellen. Die Struktur der Zeichenfolgenbindung muss vier umgekehrte Schrägstriche enthalten, um die beiden umgekehrten Schrägstriche in Literal darzustellen, die dem Servernamen vorangehen.

Das folgende Beispiel zeigt, dass dem Servernamen acht umgekehrte Schrägstriche vorangestellt werden müssen, damit vier umgekehrte Literalzeichen in der Datenstruktur der Zeichenfolgenbindung angezeigt werden, nachdem die sprintf_s-Funktion die Zeichenfolge verarbeitet hat.

/* client application */

char * pszUuid = "6B29FC40-CA47-1067-B31D-00DD010662DA";
char * pszProtocol = "ncacn_np";
char * pszNetworkAddress = "\\\\\\\\servername";
char * pszEndpoint = "\\\\pipe\\\\pipename";
char * pszString;
 
int len = 0;
 
len  = sprintf_s(pszString, strlen(pszUuid), "%s", pszUuid);
len += sprintf_s(pszString + len, strlen(pszProtocolSequence) + 2, "@%s:",
    pszProtocolSequence);
if (pszNetworkAddress != NULL)
    len += sprintf_s(pszString + len, strlen(pszNetworkAddress), "%s",
    pszNetworkAddress);
len += sprintf_s(pszString + len, strlen(pszEndpoint) + 2, "[%s]", pszEndpoint);

Im folgenden Beispiel wird die Zeichenfolgenbindung wie folgt angezeigt:

6B29FC40-CA47-1067-B31D-00DD010662DA@ncacn_np:\\\servername[\\pipe\\pipename]

Der Client ruft dann RpcBindingFromStringBinding auf, um das Bindungshandle abzurufen:

RPC_BINDING_HANDLE hBinding;
 
status = RpcBindingFromStringBinding(pszString, &hBinding);
//...

RpcStringBindingCompose ist eine Komfortfunktion, die das Objekt UUID, die Protokollsequenz, die Netzwerkadresse und den Endpunkt in der richtigen Syntax für den Aufruf von RpcBindingFromStringBinding zusammenfügt. Sie müssen sich nicht darum kümmern, das Ampersand, den Doppelpunkt und die verschiedenen Komponenten für jede Protokollsequenz an der richtigen Stelle zu platzieren. Sie geben nur die Zeichenfolgen als Parameter für die Funktion an. Die Laufzeitbibliothek weist sogar den arbeitsspeicher zu, der für die Zeichenfolgenbindung benötigt wird.

char * pszNetworkAddress = "\\\\server";
char * pszEndpoint = "\\pipe\\pipename";
status = RpcStringBindingCompose(
            pszUuid,
            pszProtocolSequence,
            pszNetworkAddress,
            pszEndpoint,
            pszOptions,
            &pszString);
//...
status = RpcBindingFromStringBinding(
            pszString,
            &hBinding);
//...

Eine weitere Komfortfunktion, RpcBindingToStringBinding, nimmt ein Bindungshandle als Eingabe an und erzeugt die entsprechende Zeichenfolgenbindung.

Importieren aus Namensdienstdatenbanken

Namensdienstdatenbanken speichern unter anderem Bindungshandles und UUIDs. Ihre Clientanwendung kann nach einem oder beiden suchen, wenn sie an den Server gebunden werden muss. Eine Erläuterung der Informationen, die ein Namensdienst speichert, und des Speicherformats finden Sie unter Rpc Name Service Database.

Die RPC-Bibliothek stellt zwei Funktionssätze bereit, die Ihr Clientprogramm zum Durchsuchen der Namensdienstdatenbank verwenden kann. Die Namen eines Satzes beginnen mit RpcNsBindingImport. Die Namen der anderen Gruppe beginnen mit RpcNsBindingLookup. Der Unterschied zwischen den beiden Funktionsgruppen besteht darin, dass die RpcNsBindingImport-Funktionen ein einzelnes Bindungshandle pro Aufruf zurückgeben und die RpcNsBindingLookup-Funktionen Gruppen von Handles pro Aufruf zurückgeben.

Um eine Suche mit den Funktionen RpcNsBindingImport zu starten, rufen Sie zuerst RpcNsBindingImportBegin auf, wie im folgenden Codefragment gezeigt.

RPC_STATUS status;
RPC_NS_HANDLE hNameServiceHandle;
 
status = RpcNsBindingImportBegin(
    RPC_C_NS_SYNTAX_DEFAULT,
    NULL,
    MyInterface_v1_0_c_ifspec,
    NULL,
    &hNameServiceHandle);

Wenn die RPC-Funktionen die Namensdienstdatenbank durchsuchen, benötigen sie einen Ort, um mit der Suche zu beginnen. In der RPC-Terminologie wird dies als Eintragsname bezeichnet. Ihr Clientprogramm übergibt den Eintragsnamen als zweiten Parameter an RpcNsBindingImportBegin. Dieser Parameter kann NULL sein, wenn Sie die gesamte Namensdienstdatenbank durchsuchen möchten. Alternativ können Sie den Servereintrag durchsuchen, indem Sie einen Servereintragsnamen übergeben oder den Gruppeneintrag durchsuchen, indem Sie einen Gruppeneintragsnamen übergeben. Das Übergeben eines Eintragsnamens schränkt die Suche auf den Inhalt dieses Eintrags ein.

Im vorherigen Beispiel wird der Wert RPC_C_NS_SYNTAX_DEFAULT als erster Parameter an RpcNsBindingImportBegin übergeben. Dadurch wird die Standardsyntax des Eintragsnamens ausgewählt. Derzeit ist dies die einzige unterstützte Einstiegsnamensyntax.

Ihre Clientanwendung kann die Namensdienstdatenbank nach einem Schnittstellennamen, einer UUID oder beidem durchsuchen. Wenn Sie nach einer Schnittstelle nach Namen suchen möchten, übergeben Sie die globale Schnittstellenvariable, die der MIDL-Compiler aus Ihrer IDL-Datei generiert, als dritten Parameter an RpcNsBindingImportBegin. Die Deklaration befindet sich in der Headerdatei, die der MIDL-Compiler beim Generieren des Client-Stubs generiert hat. Wenn Ihr Clientprogramm nur nach UUID suchen soll, legen Sie den dritten Parameter auf NULL fest.

Legen Sie beim Durchsuchen der Namensdienstdatenbank nach einer UUID den vierten Parameter von RpcNsBindingImportBegin auf die UUID fest, nach der Sie suchen möchten. Wenn Sie nicht nach einer UUID suchen, legen Sie diesen Parameter auf NULL fest.

Die RpcNsBindingImportBegin-Funktion übergibt die Adresse eines Namensdienst-Suchkontexthandles über den fünften Parameter. Sie übergeben diesen Parameter an andere RpcNsBindingImport-Funktionen.

Insbesondere ist die nächste Funktion, die Ihre Clientanwendung aufrufen würde , RpcNsBindingImportNext. Clientprogramme verwenden diese Funktion, um kompatible Bindungshandles aus der Namensdienstdatenbank abzurufen. Das folgende Codefragment veranschaulicht, wie diese Funktion aufgerufen werden kann:

RPC_STATUS status;
RPC_BINDING_HANDLE hBindingHandle;
// The variable hNameServiceHandle is a valid name service search 
// context handle obtained from the RpcNsBindingBegin function.
 
status = RpcNsBindingImportNext(hNameServiceHandle, &hBindingHandle);

Nachdem die RpcNsBindingImportNext-Funktion aufgerufen wurde, um ein Bindungshandle abzurufen, kann Ihre Clientanwendung ermitteln, ob das empfangene Handle akzeptabel ist. Andernfalls kann Ihr Clientprogramm eine Schleife ausführen und RpcNsBindingImportNext erneut aufrufen, um festzustellen, ob der Namesdienst ein geeigneteres Handle enthält. Für jeden Aufruf von RpcNsBindingImportNext muss ein entsprechender Aufruf von RpcNsBindingFree vorhanden sein. Rufen Sie nach Abschluss der Suche die RpcNsBindingImportDone-Funktion auf, um den Suchkontext frei zu geben.

Nachdem Ihre Clientanwendung über ein akzeptables Bindungshandle verfügt, sollte sie überprüfen, ob die Serveranwendung ausgeführt wird. Es gibt zwei Methoden, die Ihr Client verwenden kann, um diese Überprüfung durchzuführen. Die erste besteht darin, eine Funktion in der Clientschnittstelle aufzurufen. Wenn das Serverprogramm ausgeführt wird, wird der Aufruf abgeschlossen. Andernfalls schlägt der Aufruf fehl. Eine bessere Möglichkeit, um zu überprüfen, ob der Server ausgeführt wird, besteht darin , RpcEpResolveBinding aufzurufen, gefolgt von einem Aufruf von RpcMgmtIsServerListening. Weitere Informationen zur Namensdienstdatenbank finden Sie unter Die RPC-Name-Dienstdatenbank.