Spécification de points de terminaison
Un point de terminaison est une adresse propre au réseau d’un processus serveur pour les appels de procédure distante. Le nom réel du point de terminaison dépend de la séquence de protocole utilisée. Par exemple, TCP, UDP et HTTP utilisent des ports. Les canaux nommés utilisent un nom de canal nommé. Les applications clientes/serveur peuvent utiliser un point de terminaison connu ou un point de terminaison dynamique. Cette section présente les techniques utilisées par les programmes serveur pour spécifier des points de terminaison connus et dynamiques. Les informations sont abordées dans les rubriques suivantes :
Spécification de points de terminaison connus
Lorsque votre serveur utilise un point de terminaison connu, il peut inclure les données de point de terminaison dans son entrée de base de données de service de noms. Si c’est le cas, le handle de liaison du client contient une adresse serveur complète qui inclut le point de terminaison connu lorsque le client importe le handle de liaison à partir de l’entrée du serveur.
Votre programme serveur peut également spécifier des points de terminaison connus en même temps qu’il spécifie des séquences de protocole. Appelez la fonction RpcServerUseProtseqEp ou RpcServerUseProtseqEpEx . La différence entre les deux est que cette dernière fonction a un paramètre supplémentaire que votre serveur peut utiliser pour contrôler l’allocation dynamique des ports.
Si votre programme serveur spécifie ses informations de point de terminaison de cette manière, il doit également appeler la fonction RpcEpRegister pour inscrire le point de terminaison dans la carte de point de terminaison. Même si le point de terminaison est toujours le même, le client peut utiliser la carte du point de terminaison pour rechercher le serveur.
Comme les séquences de protocole, une application peut spécifier des informations de point de terminaison dans son fichier IDL. Dans ce cas, il doit inscrire les séquences de protocole et les points de terminaison en même temps en appelant la fonction RpcServerUseAllProtseqsIf ou RpcServerUseAllProtseqsIfEx . Dans ce cas, le client a accès aux informations du point de terminaison via la spécification d’interface dans le fichier IDL. Par conséquent, il n’est pas nécessaire d’appeler la fonction RpcEpRegister .
Spécification de points de terminaison dynamiques
Un point de terminaison dynamique est un point de terminaison que l’ordinateur hôte du serveur attribue lorsque le serveur commence l’exécution. La plupart des applications serveur utilisent des points de terminaison dynamiques pour éviter les conflits avec d’autres programmes sur le nombre limité de ports disponibles sur le système informatique hôte du serveur. Toutefois, les programmes utilisant des canaux nommés ou la séquence de protocole ncalrpc ont un très grand espace de nom de point de terminaison. Ils bénéficient moins des points de terminaison dynamiques que les programmes utilisant d’autres transports.
Les programmes serveur inscrivent des points de terminaison dynamiques dans une base de données de mappage de points de terminaison. Si vous souhaitez que le serveur utilise un point de terminaison disponible, appelez RpcServerUseAllProtSeqs, RpcServerUseAllProtseqsEx, RpcServerUseProtseq ou RpcServerUseProtseqEx. Cela définit la bibliothèque d’exécution RPC pour qu’elle utilise toutes ou une séquences de protocole valides avec des points de terminaison dynamiques. Le serveur doit ensuite appeler RpcServerInqBindings pour obtenir un ensemble de handles de liaison valides. Le serveur transmet l’ensemble de handles de liaison, ou vecteur de liaison, à la fonction RpcEpRegister pour inscrire tous les points de terminaison appropriés dans la carte de point de terminaison. Pour chaque appel que votre serveur effectue à RpcEpRegister, il doit y avoir un appel correspondant à RpcBindingVectorFree pour libérer la mémoire utilisée par le vecteur de liaison.
Notez que les programmes serveur peuvent utiliser la fonction RpcEpRegisterNoReplace plutôt que RpcEpRegister. Les programmes utilisent généralement RpcEpRegisterNoReplace lorsque plusieurs copies d’un programme serveur doivent s’exécuter sur un système hôte serveur.
Les fonctions RpcEpRegister et RpcEpRegisterNoReplace ajoutent les interfaces et les handles de liaison du serveur à la base de données du mappeur de point de terminaison. Lorsque le client effectue un appel de procédure distante à l’aide d’un handle partiellement lié, la bibliothèque d’exécution du client demande au mappeur de point de terminaison de l’ordinateur serveur le point de terminaison d’un serveur compatible instance. La bibliothèque cliente fournit l’UUID d’interface, la séquence de protocole et, le cas échéant, l’UUID d’objet dans le handle de liaison client. Le mappeur de point de terminaison recherche une entrée de base de données qui correspond aux informations du client. L’UUID de l’interface client/serveur, la version principale de l’interface et la séquence de protocole doivent toutes correspondre exactement. En outre, la version mineure de l’interface du serveur doit être supérieure ou égale à la version mineure du client.
Si tous les tests réussissent, le mappeur de point de terminaison retourne le point de terminaison valide et la bibliothèque d’exécution du client met à jour le point de terminaison dans le handle de liaison.
Les points de terminaison dynamiques sont automatiquement vidés de la base de données du mappeur de point de terminaison lorsque le processus serveur cesse de s’exécuter. Vous pouvez soit supprimer le point de terminaison de la base de données du mappeur de point de terminaison avant que le programme serveur ne se termine à l’aide de la fonction RpcEpUnregister , ou vous pouvez autoriser le nettoyage automatique pour gérer la suppression du point de terminaison.