Se connecter
Se connecter
Inscription
Mot de passe perdu
Connexion:
[Actualités]
Nvidia prévient d'une pénurie de GPU ce trimestre, avec une reprise début 2025
[Actualités]
Les Technos #469 : Un jour sans fin
[Actualités]
Test Farming Simulator 25 (PS5) - Des innovations intéressantes mais des perfor...
[Actualités]
Qualcomm souhaite réduire davantage les prix des PC Windows basés sur ARM
[Actualités]
Finalement, Google préparerait une nouvelle tablette mais la Pixel Tablet 2 ser...
[Actualités]
Windows 10 version 22H2 : erreur de mise à jour et de désinstallation
[Actualités]
OpenAI prépare désormais son propre navigateur
[Actualités]
WhatsApp bat Telegram : les transcriptions des messages vocaux arrivent pour tou...
[Actualités]
Unreal et Unreal Tournament désormais gratuits sur Internet Archive
[Actualités]
Windows 10 : Microsoft affiche des publicités en plein écran pour les PC équi...
[Articles]
Dungeons 4 - Nintendo Switch Edition
[Articles]
The Bridge Curse 2 : The Extrication
[Articles]
Farmagia
[Articles]
I*CHU: Chibi Edition
[Articles]
Farming Simulator 25
[Articles]
Goblin Slayer -Another Adventurer- Nightmare Feast
[Articles]
Deel lance des programmes en marque blanche et pour les revendeurs pour plus de ...
[Articles]
ESET Research : WolfsBane, nouvelle porte dérobée de cyber-espionnage Linux cr...
[Articles]
Devoteam présente son nouveau plan stratégique « AMPLIFY » avec un fort acce...
[Articles]
LEGO Horizon Adventures
Actualités
Lettre d'information
Proposer une actualité
Archives
Actualités
Articles
Programmation
Press Release
Matériel
Logiciels
Livres
Interviews
Derniers commentaires
Jeux Vidéos
XBox One
XBox 360
Wii U
PSP
PS4
PS3
PC
DS
GameCube
3DS
Forum
Derniers messages
Informatique
Fun
Divers
Logithèque
Blogs
Divers
A Propos
Annonceurs
Contact
Recherche
RSS
Editer un article
Titre
Mots Clés
Texte
[size=18] [b]Nom[/b] [/size] rpc - Bibliothèque de fonctions pour les appels de procédures à distance. [size=18] [b]Description[/b] [/size] [NDT] RPC = Remote Procedure Call. Ces routines permettent à des programmes C de faire des appels de procédures vers d'autres machines à travers le réseau. D'abord le client invoque une procédure pour envoyer un paquet de données vers le serveur. À la réception du paquet, le serveur appelle une routine de distribution pour exécuter le service demandé, et renvoyer une réponse. Finalement, l'appel de procédure revient au client. Les routines qui utilisent les RPC sécurisées (authentification DES) sont décrites dans [b]rpc_secure (3N).[/b] Les RPC sécurisées ne sont possibles que si le cryptage DES est disponible. .ft B .nf .5 #include
.fi .ft R [b][/b] .if t .ne 8 .ft B .nf .5 void auth_destroy(auth) s-1AUTHs0 *auth; .fi .ft R [table][row][col] [/col][col]Cette macro détruit les informations d'authentification associée avec [b]auth .[/b] La destruction implique généralement la désallocation de données privées. Le comportement est indéfini si on essaye d'utiliser [i]auth[/i] après avoir invoqué [b]auth_destroy() .[/b] [b][/b] .if t .ne 6[/col][/row][/table] .ft B .nf .5 s-1AUTHs0 * authnone_create() .fi .ft R [table][row][col] [/col][col]Crée et renvoie un descripteur d'authentification [size=6]RPC[/size] transmettant avec chaque appel de procédure une information d'authentification nulle. C'est le comportement par défaut pour les [size=6]RPC.[/size] .if t .ne 10[/col][/row][/table] .ft B .nf .5 s-1AUTHs0 * authunix_create(host, uid, gid, len, aup_gids) char *host; int uid, gid, len, *aup.gids; .fi .ft R [table][row][col] [/col][col]Crée et renvoie un descripteur d'authentification [size=6]RPC[/size] Unix, contenant des .UX informations d'identification. L'argument [i]host[/i] est le nom de la machine sur laquelle l'information est créée. [i]uid[/i] est l'identification de l'utilisateur [i]gid[/i] est l'identification du groupe de l'utilisateur [i]len[/i] et [i]aup_gids[/i] concernent la table des groupes supplémentaires auxquels l'utilisateur appartient. On peut facilement se faire passer pour quelqu'un d'autre. [b][/b] .if t .ne 5[/col][/row][/table] .ft B .nf .5 s-1AUTHs0 * authunix_create_default() .fi .ft R [table][row][col] [/col][col]Appelle [b]authunix_create()[/b] avec les arguments appropriés. [b][/b] .if t .ne 13[/col][/row][/table] .ft B .nf .5 callrpc(host, prognum, versnum, procnum, inproc, in, outproc, out) char *host; u_long prognum, versnum, procnum; char *in, *out; xdrproc_t inproc, outproc; .fi .ft R [table][row][col] [/col][col]Appelle la procédure distante associée aux arguments [b]prognum ,[/b] [b]versnum ,[/b] et [i]procnum[/i] sur la machine, [b]host .[/b] L'argument [i]in[/i] est l'adresse du ou des arguments d'entrée de la procédure, [i]out[/i] celle de l'emplacement où stocker le ou les résultats, [i]inproc[/i] sert à encoder les paramètres d'entrée de la procédure, et [i]outproc[/i] à décoder les résultats de la procédure. Cette routine renvoie zéro si elle réussit, ou la valeur de [b]enum clnt_stat[/b] transposée en un nombre entier si elle échoue La routine [b]clnt_perrno()[/b] permet de traduire les codes d'échec en messages.[/col][/row][/table] [table][row][col] [/col][col]Attention : l'appel d'une procédure distante avec cette routine emploie le protocole [size=6]UDP/IP[/size] pour le transport, voir [b]clntudp_create()[/b] pour certaines restrictions. Vous n'avez aucun contrôle sur le délai maximal ou sur l'authentification avec cette routine. [b][/b] .if t .ne 16[/col][/row][/table] .ft B .nf .5 enum clnt_stat clnt_broadcast(prognum, versnum, procnum, inproc, in, outproc, out, eachresult) u_long prognum, versnum, procnum; char *in, *out; xdrproc_t inproc, outproc; resultproc_t eachresult; .fi .ft R [table][row][col] [/col][col]Comme [b]callrpc() ,[/b] sauf que le message d'appel est diffusé sur tous les réseaux connectés. À chaque réception d'une réponse, cette routine appelle la fonction [b]eachresult() ,[/b] dont la forme est :[/col][/row][/table] [table][row][col] [/col][col] [table][row][col] [/col][col].ft B .nf eachresult(out, addr) char *out; struct sockaddr_in *addr; .ft R .fi[/col][/row][/table][/col][/row][/table] [table][row][col] [/col][col]où [i]out[/i] est du même type que le [i]out[/i] passé à [b]clnt_broadcast() ,[/b] avec la différence que la sortie de la procédure distante est décodée ici. [i]addr[/i] pointe vers l'adresse de la machine qui a envoyé le résultat. Si [b]eachresult()[/b] renvoie zéro, [b]clnt_broadcast()[/b] attend d'autres réponses. Sinon elle revient avec le code de retour approprié.[/col][/row][/table] [table][row][col] [/col][col]Attention : les socket broadcast sont limitées en ce qui concerne la taille maximale des données. Pour l'Ethernet cette valeur (MTU) vaut 1500 octets. [b][/b] .if t .ne 13[/col][/row][/table] .ft B .nf .5 enum clnt_stat clnt_call(clnt, procnum, inproc, in, outproc, out, tout) s-1CLIENTs0 *clnt; u_long procnum; xdrproc_t inproc, outproc; char *in, *out; struct timeval tout; .fi .ft R [table][row][col] [/col][col]Une macro qui appelle la procédure distante [i]procnum[/i] associée avec le descripteur de client [b]clnt ,[/b] qui est obtenu grâce à une routine de création de client [size=6]RPC[/size] comme [b]clnt_create() .[/b] L'argument [i]in[/i] est l'adresse du ou des arguments d'entrée de la procédure, [i]out[/i] celle de l'emplacement où stocker le ou les résultats, [i]inproc[/i] sert à encoder les paramètres d'entrée de la procédure, et [i]outproc[/i] à décoder les résultats de la procédure. [i]tout[/i] est le délai maximal accordé pour la réalisation de la procédure. [b][/b] .if t .ne 7[/col][/row][/table] .ft B .nf .5 clnt_destroy(clnt) s-1CLIENTs0 *clnt; .fi .ft R [table][row][col] [/col][col]Une macro qui détruit le descripteur de client [size=6]RPC[/size] ce qui implique généralement la libération de structures de données privées, y compris [i]clnt[/i] lui même. Le comportement est indéfini si on tente d'utiliser [i]clnt[/i] après avoir appelé [b]clnt_destroy() .[/b] Si la bibliothèque [size=6]RPC[/size] avait ouvert la socket associée, elle sera également fermée. Sinon, la socket reste ouverte. [b][/b] .if t .ne 10[/col][/row][/table] .ft B .nf .5 s-1CLIENTs0 * clnt_create(host, prog, vers, proto) char *host; u_long prog, vers; char *proto; .fi .ft R [table][row][col] [/col][col]Routine générique de création de client. [i]host[/i] identifie le nom de l'hôte distant où se trouve le serveur. [i]proto[/i] indique le type de protocole de transport à employer. Les valeurs actuellement supportées pour ce champ sont (lqudp(rq et (lqtcp(rq. Des valeurs par défaut sont configurées pour les délais, mais peuvent être modifiée à l'aide de [b]clnt_control() .[/b][/col][/row][/table] [table][row][col] [/col][col]Attention : l'utilisation du protocole [size=6]UDP[/size] a des inconvénients. Comme les messages [size=6]RPC[/size] basés sur [size=6]UDP[/size] ne peuvent contenir que 8 Ko de données encodées, ce protocole ne peut pas être utilisé pour des procédures nécessitant de gros arguments, ou renvoyant d'énormes résultats. [b][/b] .if t .ne 10[/col][/row][/table] .ft B .nf .5 bool_t clnt_control(cl, req, info) s-1CLIENTs0 *cl; char *info; .fi .ft R [table][row][col] [/col][col]Une macro employée pour modifier ou récupérer des informations diverses à propose d'un objet client. [i]req[/i] indique le type d'opération, et [i]info[/i] est un pointeur sur l'information. Pour [size=6]UDP[/size] comme pour [size=6]TCPs0,[/size] les valeurs autorisées pour [i]req[/i] et le type des arguments sont :[/col][/row][/table] [table][row][col] [/col][col].nf .ta +2.0i +2.0i +2.0i [size=6]CLSET_TIMEOUTs0 struct timeval fixer le délai total[/size] [size=6]CLGET_TIMEOUTs0 struct timeval lire le délai total[/size] .fi[/col][/row][/table] [table][row][col] [/col][col]Note: Si vous fixez le délai avec [b]clnt_control() ,[/b] le dernier argument de [b]clnt_call()[/b] sera ignoré lors des appels ultérieurs.[/col][/row][/table] [table][row][col] [/col][col].nf [size=6]CLGET_SERVER_ADDRs0 struct sockaddr_in get servers address[/size] .fi [b][/b][/col][/row][/table] [table][row][col] [/col][col]Les opérations suivantes sont valides pour le protocole [size=6]UDP[/size] seulement :[/col][/row][/table] [table][row][col] [/col][col].nf .ta +2.0i +2.0i +2.0i [size=6]CLSET_RETRY_TIMEOUTs0 struct timeval fixer le délai de répétition[/size] [size=6]CLGET_RETRY_TIMEOUTs0 struct timeval lire le délai de répétition[/size] .fi [b][/b][/col][/row][/table] [table][row][col] [/col][col]Le délai de répétition est le temps pendant lequel les [size=6]RPC UDP[/size] attendent une réponse du serveur avant retransmettre la requête. [b][/b] .if t .ne 10[/col][/row][/table] .ft B .nf .5 clnt_freeres(clnt, outproc, out) s-1CLIENTs0 *clnt; xdrproc_t outproc; char *out; .fi .ft R [table][row][col] [/col][col]Une macro qui libère toutes les données allouées par le système [size=6]RPC/XDR[/size] lorsqu'il a décodé les résultats d'un appel [size=6]RPC[/size] L'argument [i]out[/i] est l'adresse des résultats, et [i]outproc[/i] est la routine [size=6]XDR[/size] décodant les résultats. Cette fonction renvoie 1 si les résultats ont été correctement libérés, et zéro sinon. [b][/b] .if t .ne 6[/col][/row][/table] .ft B .nf .5 void clnt_geterr(clnt, errp) s-1CLIENTs0 *clnt; struct rpc_err *errp; .fi .ft R [table][row][col] [/col][col]Une macro qui copie la structure d'erreur depuis le descripteur de client vers la structure se trouvant à l'adresse [b]errp .[/b] [b][/b] .if t .ne 8[/col][/row][/table] .ft B .nf .5 void clnt_pcreateerror(s) char *s; .fi .ft R [table][row][col] [/col][col]Affiche un message sur la sortie d'erreur standard, indiquant pourquoi un descripteur de client [size=6]RPC[/size] ne peut pas être créé. Ce message est préfixé avec la chaîne [i]s[/i] et un deux-points est inséré. À utiliser lorsque les appels [b]clnt_create() ,[/b] [b]clntraw_create() ,[/b] [b]clnttcp_create() ,[/b] ou [b]clntudp_create()[/b] échouent. [b][/b] .if t .ne 8[/col][/row][/table] .ft B .nf .5 void clnt_perrno(stat) enum clnt_stat stat; .fi .ft R [table][row][col] [/col][col]Affiche un message sur la sortie d'erreur standard, correspondant à la condition indiquée par [b]stat .[/b] À utiliser après [b]callrpc() .[/b] [b][/b] .if t .ne 8[/col][/row][/table] .ft B .nf .5 clnt_perror(clnt, s) s-1CLIENTs0 *clnt; char *s; .fi .ft R [table][row][col] [/col][col]Affiche un message sur la sortie d'erreur standard indiquant pourquoi un appel [size=6]RPC[/size] a échoué. [i]clnt[/i] est le descripteur utilisé pour l'appel. Ce message est préfixé avec la chaîne [i]s[/i] et un deux-points est inséré. À utiliser après [b]clnt_call() .[/b] [b][/b] .if t .ne 9[/col][/row][/table] .ft B .nf .5 char * clnt_spcreateerror char *s; .fi .ft R [table][row][col] [/col][col]Comme [b]clnt_pcreateerror() ,[/b] sauf qu'il renvoie une chaîne au lieu d'écrire sur la sortie d'erreur standard.[/col][/row][/table] [table][row][col] [/col][col]Danger : renvoie un pointeur vers une zone de donnée statique, écrasée à chaque appel. [b][/b] .if t .ne 9[/col][/row][/table] .ft B .nf .5 char * clnt_sperrno(stat) enum clnt_stat stat; .fi .ft R [table][row][col] [/col][col]Emploie les même arguments que [b]clnt_perrno() ,[/b] mais au lien d'envoyer un message sur la sortie d'erreur standard indiquant pourquoi un appel [size=6]RPC[/size] a échoué, renvoie un pointeur sur une chaîne contenant le message. La chaîne se termine par un [size=6]NEWLINEs0.[/size][/col][/row][/table] [b]clnt_sperrno()[/b] [table][row][col] [/col][col]est utilisé à la place de [b]clnt_perrno()[/b] si le programme n'a pas de sortie d'erreur standard (un serveur par exemple n'en a généralement pas), ou si le programmeur ne veut pas que le message soit affiché avec [b]printf ,[/b] ou si un format de message différent de celui fourni par [b]clnt_perrno()[/b] doit être utilisé. Note : contrairement à [b]clnt_sperror()[/b] et [b]clnt_spcreaterror() ,[/b] [b]clnt_sperrno()[/b] renvoie un pointeur sur une zone de donnée statique, mais le résultat ne sera pas écrasé à chaque appel. [b][/b] .if t .ne 7[/col][/row][/table] .ft B .nf .5 char * clnt_sperror(rpch, s) s-1CLIENTs0 *rpch; char *s; .fi .ft R [table][row][col] [/col][col]Comme [b]clnt_perror() ,[/b] sauf que (comme [b]clnt_sperrno() )[/b] il renvoie une chaîne au lieu d'écrire sur la sortie d'erreur standard.[/col][/row][/table] [table][row][col] [/col][col]Danger : renvoie un pointeur vers une zone de donnée statique, écrasée à chaque appel. [b][/b] .if t .ne 10[/col][/row][/table] .ft B .nf .5 s-1CLIENTs0 * clntraw_create(prognum, versnum) u_long prognum, versnum; .fi .ft R [table][row][col] [/col][col]Cette routine crée un simili client [size=6]RPC[/size] pour le programme distant [b]prognum ,[/b] de version [b]versnum .[/b] Le mécanisme de transport pour les message est en réalité un buffer dans l'espace d'adresse du processus, ainsi le serveur [size=6]RPC[/size] doit se trouver dans le même espace d'adresse. Voir [b]svcraw_create() .[/b] Cela permet de simuler une [size=6]RPC[/size] et de mesurer la surcharge des procédures [size=6]RPC[/size] comme les temps d'aller-retour sans interférence due au noyau. Cette routine renvoie [size=6]NULL[/size] si elle échoue. [b][/b] .if t .ne 15[/col][/row][/table] .ft B .nf .5 s-1CLIENTs0 * clnttcp_create(addr, prognum, versnum, sockp, sendsz, recvsz) struct sockaddr_in *addr; u_long prognum, versnum; int *sockp; u_int sendsz, recvsz; .fi .ft R [table][row][col] [/col][col]Cette routine crée un client [size=6]RPC[/size] pour le programme distant [b]prognum ,[/b] de version [b]versnum ;[/b] Le client utilise [size=6]TCP/IP[/size] pour le transport. Le programme distant se trouve à l'adresse Internet [b]*addr .[/b] Si [b][/b]%addr->sin_port vaut zéro, alors il est rempli avec le numéro de port sur lequel le programme distant est en écoute (on consulte le service [b]portmap[/b] distant pour obtenir cette information). L'argument [i]sockp[/i] est une socket; si c'est [b]s-1RPC_ANYSOCKs0 ,[/b] alors la routine ouvre une nouvelle socket et remplit [b]sockp .[/b] Comme les [size=6]RPC[/size] basées sur [size=6]TCP[/size] utilisent des entrées-sorties avec buffers, l'utilisateur peut spécifier la taille des buffers d'entrée et de sortie avec les paramètres [i]sendsz[/i] et [b]recvsz .[/b] Des valeurs nulles réclament l'utilisation de buffers de tailles optimales. Cette routine renvoie [size=6]NULL[/size] si elle échoue. [b][/b] .if t .ne 15[/col][/row][/table] .ft B .nf .5 s-1CLIENTs0 * clntudp_create(addr, prognum, versnum, wait, sockp) struct sockaddr_in *addr; u_long prognum, versnum; struct timeval wait; int *sockp; .fi .ft R [table][row][col] [/col][col]Cette routine crée un client [size=6]RPC[/size] pour le programme distant [b]prognum ,[/b] de version [b]versnum ;[/b] Le client utilise [size=6]UDP/IP[/size] pour le transport. Le programme distant se trouve à l'adresse Internet [b]*addr .[/b] Si [b][/b]%addr->sin_port vaut zéro, alors il est rempli avec le numéro de port sur lequel le programme distant est en écoute (on consulte le service [b]portmap[/b] distant pour obtenir cette information). L'argument [i]sockp[/i] est une socket; si c'est [b]s-1RPC_ANYSOCKs0 ,[/b] alors la routine ouvre une nouvelle socket et remplit [b]sockp .[/b] Le protocole de transport [size=6]UDP[/size] renvoie le message d'appel avec un intervalle de temps indiqué par [b]wait[/b] jusqu'à la réception d'une réponse ou jusqu'au dépassement du temps maximal. Ce délai total pour l'appel est spécifié par la fonction [b]clnt_call() .[/b][/col][/row][/table] [table][row][col] [/col][col]Attention : comme les messages des [size=6]RPC[/size] basées sur [size=6]UDP[/size] ne peuvent contenir que 8 Ko de données encodées, ce protocole ne peut pas être utilisé pour des procédures nécessitant de gros arguments, ou renvoyant d'énormes résultats. [b][/b] .if t .ne 8[/col][/row][/table] .ft B .nf .5 s-1CLIENTs0 * clntudp_bufcreate(addr, prognum, versnum, wait, sockp, sendsize, recosize) struct sockaddr_in *addr; u_long prognum, versnum; struct timeval wait; int *sockp; unsigned int sendsize; unsigned int recosize; .fi .ft R [table][row][col] [/col][col]Cette routine crée un client [size=6]RPC[/size] pour le programme distant [b]prognum ,[/b] de version [b]versnum ;[/b] Le client utilise [size=6]UDP/IP[/size] pour le transport. Le programme distant se trouve à l'adresse Internet [b]*addr .[/b] Si [b][/b]%addr->sin_port vaut zéro, alors il est rempli avec le numéro de port sur lequel le programme distant est en écoute (on consulte le service [b]portmap[/b] distant pour obtenir cette information). L'argument [i]sockp[/i] est une socket; si c'est [b]s-1RPC_ANYSOCKs0 ,[/b] alors la routine ouvre une nouvelle socket et remplit [b]sockp .[/b] Le protocole de transport [size=6]UDP[/size] renvoie le message d'appel avec un intervalle de temps indiqué par [b]wait[/b] jusqu'à la réception d'une réponse ou jusqu'au dépassement du temps maximal. Ce délai total pour l'appel est spécifié par la fonction [b]clnt_call() .[/b][/col][/row][/table] [table][row][col] [/col][col]Cette routine permet au programmeur de préciser la taille maximale des buffers en émission et réception pour les messages [size=6]RPC[/size] basés sur [size=6]UDP.[/size] [b][/b] .if t .ne 7[/col][/row][/table] .ft B .nf .5 void get_myaddress(addr) struct sockaddr_in *addr; .fi .ft R [table][row][col] [/col][col]Fournit l'adresse [size=6]IP[/size] de la machine dans la structure [b]*addr ,[/b] sans consulter les routines de bibliothèques qui manipulent [b]/etc/hosts .[/b] Le numéro de port est toujours rempli avec [b]htons(s-1PMAPPORTs0) .[/b] [b][/b] .if t .ne 10[/col][/row][/table] .ft B .nf .5 struct pmaplist * pmap_getmaps(addr) struct sockaddr_in *addr; .fi .ft R [table][row][col] [/col][col]Une interface utilisateur pour le service [b]portmap[/b] renvoyant une liste des associations en cours entre programmes [size=6]RPC[/size] et ports sur l'hôte situé à l'adresse [size=6]IP[/size] indiquée dans [b]*addr .[/b] Cette routine peut renvoyer [b]NULL .[/b] La commande [b] rpcinfo -p [/b] utilise cette fonction [b][/b] .if t .ne 12[/col][/row][/table] .ft B .nf .5 u_short pmap_getport(addr, prognum, versnum, protocol) struct sockaddr_in *addr; u_long prognum, versnum, protocol; .fi .ft R [table][row][col] [/col][col]Une interface utilisateur pour le service [b]portmap[/b] qui renvoie le numéro de port sur lequel est en écoute le service associé au programme numéro [b]prognum ,[/b] de version [b]versnum ,[/b] en utilisant le protocole de transport associé avec [b]protocol .[/b] La valeur de l'argument [i]protocol[/i] est normalement .B [size=6]IPPROTO_UDP[/size] ou [b]s-1IPPROTO_TCPs0 .[/b] Une valeur de retour nulle signifie qu'aucune association n'existe ou qu'une erreur du système [size=6]RPC[/size] s'est produite en tentant de contacter le service [b]portmap[/b] distant. Dans ce cas, la variable globale [b]rpc_createerr()[/b] contient le code [size=6]RPC[/size] de l'erreur. [b][/b] .if t .ne 15[/col][/row][/table] .ft B .nf .5 enum clnt_stat pmap_rmtcall(addr, prognum, versnum, procnum, inproc, in, outproc, out, tout, portp) struct sockaddr_in *addr; u_long prognum, versnum, procnum; char *in, *out; xdrproc_t inproc, outproc; struct timeval tout; u_long *portp; .fi .ft R [table][row][col] [/col][col]Une interface utilisateur pour le service [b]portmap[/b] qui demande au programme [b]portmap[/b] sur l'hôte se trouvant à l'adresse [size=6]IP[/size] indiquée dans [i]*addr[/i] de faire en notre nom un appel [size=6]RPC[/size] pour une procédure se trouvant sur cet hôte. Le paramètre [i]*portp[/i] sera modifié pour contenir le numéro de port du programme si la procédure réussit. Les définitions des autres arguments sont présentées à propos de [b]callrpc()[/b] et de [b]clnt_call() .[/b] Cette procédure devrait être utilisée pour faire un (lqping(rq et rien d'autre. Voir aussi [b]clnt_broadcast() .[/b] [b][/b] .if t .ne 9[/col][/row][/table] .ft B .nf .5 pmap_set(prognum, versnum, protocol, port) u_long prognum, versnum, protocol; u_short port; .fi .ft R [table][row][col] [/col][col]Une interface utilisateur pour le service [b]portmap[/b] qui établit une association entre le triplet [i][ prognum , versnum , protocol][/i] et le [i]port[/i] sur la machine du service [b]portmap[/b] La valeur du [i]protocol[/i] est normalement .B [size=6]IPPROTO_UDP[/size] ou [b]s-1IPPROTO_TCPs0 .[/b] Cette routine renvoie 1 si elle réussit, et zéro sinon. Elle est automatiquement invoquée par [b]svc_register() .[/b] [b][/b] .if t .ne 7[/col][/row][/table] .ft B .nf .5 pmap_unset(prognum, versnum) u_long prognum, versnum; .fi .ft R [table][row][col] [/col][col]Une interface utilisateur vers le service [b]portmap[/b] qui détruit toute association entre le triplet [i][ prognum , versnum , *][/i] et les [b]ports[/b] de la machine où se trouve le service [b]portmap .[/b] Cette routine renvoie 1 si elle réussit, et zéro sinon. [b][/b] .if t .ne 15[/col][/row][/table] .ft B .nf .5 registerrpc(prognum, versnum, procnum, procname, inproc, outproc) u_long prognum, versnum, procnum; char *(*procname) () ; xdrproc_t inproc, outproc; .fi .ft R [table][row][col] [/col][col]Enregistre la procédure [i]procname[/i] avec le service [size=6]RPC.[/size] Si une requête arrive pour le programme [b]prognum ,[/b] de version [b]versnum ,[/b] et pour la procédure [b]procnum ,[/b] [i]procname[/i] sera appelée avec un pointeur vers ses paramètres d'entrée. [i]progname[/i] doit renvoyer un pointeur vers ses résultats statiques. [i]inproc[/i] est utilisée pour décoder les paramètres d'entrée alors que [i]outproc[/i] sert à encode les résultats. Cette routine renvoie zéro si l'enregistrement à réussi, et -1 sinon.[/col][/row][/table] [table][row][col] [/col][col]Attention : les procédures enregistrées de cette manière sont accessibles avec le protocole de transport [size=6]UDP/IP.[/size] Voir [b]svcudp_create()[/b] pour ses restrictions. [b][/b] .if t .ne 5[/col][/row][/table] .ft B .nf .5 struct rpc_createerr rpc_createerr; .fi .ft R [table][row][col] [/col][col]Une variable globale dont la valeur est fixée par toute routine [size=6]RPC[/size] de création de client qui échoue. Utilisez la routine [b]clnt_pcreateerror()[/b] pour afficher la raison de l'échec. .if t .ne 7[/col][/row][/table] .ft B .nf .5 svc_destroy(xprt) s-1SVCXPRTs0 * xprt; .fi .ft R [table][row][col] [/col][col]Une macro qui détruit le descripteur de transport [size=6]RPC[/size] [b]xprt .[/b] La destruction implique normalement la libération de structures de données privées, y compris [i]xprt[/i] lui-même. Le comportement est indéfini si on essaye d'utiliser [i]xprt[/i] après avoir appelé cette routine. [b][/b] .if t .ne 8[/col][/row][/table] .ft B .nf .5 fd_set svc_fdset; .fi .ft R [table][row][col] [/col][col]Une variable globale représentant le masque de bits des descripteurs de fichier en lecture du côté serveur [size=6]RPC.[/size] Elle est utilisable avec l'appel-système [b]select .[/b] Ce n'est intéressant que si l'implémentation d'un service n'appelle pas [b]svc_run() ,[/b] mais assure son propre traitement d'évènements asynchrones. Cette variable est en lecture seule (ne passez pas son adresse à [b]select() !),[/b] et elle peut changer après un appel [b]svc_getreqset()[/b] ou une routine de création. [b][/b] .if t .ne 6[/col][/row][/table] .ft B .nf .5 int svc_fds; .fi .ft R [table][row][col] [/col][col]Similaire à [b]svc_fdset ,[/b] mais limitée à 32 descripteurs. Cette interface est rendue obsolète par [b]svc_fdset .[/b] [b][/b] .if t .ne 9[/col][/row][/table] .ft B .nf .5 svc_freeargs(xprt, inproc, in) s-1SVCXPRTs0 *xprt; xdrproc_t inproc; char *in; .fi .ft R [table][row][col] [/col][col]Une macro qui libère toutes les données allouées par le système [size=6]RPC/XDR[/size] lorsqu'il décode les arguments d'une procédure de service avec [b]svc_getargs() .[/b] Cette routine renvoie 1 si les arguments ont été correctement libérés, et zéro sinon. [b][/b] .if t .ne 10[/col][/row][/table] .ft B .nf .5 svc_getargs(xprt, inproc, in) s-1SVCXPRTs0 *xprt; xdrproc_t inproc; char *in; .fi .ft R [table][row][col] [/col][col]Une macro qui décode les arguments d'une requête [size=6]RPC[/size] associée avec le descripteur de transport [size=6]RPC[/size] [b]xprt .[/b] L'argument [i]in[/i] est l'adresse où les arguments seront stockés, [i]inproc[/i] est la routine [size=6]XDR[/size] pour décoder les arguments. Cette routine renvoie 1 si le décodage réussit, et zéro sinon. [b][/b] .if t .ne 9[/col][/row][/table] .ft B .nf .5 struct sockaddr_in * svc_getcaller(xprt) s-1SVCXPRTs0 *xprt; .fi .ft R [table][row][col] [/col][col]La manière correcte d'obtenir l'adresse réseau de l'appelant d'une procédure associée avec le descripteur de transport [size=6]RPC[/size] [b]xprt .[/b] [b][/b] .if t .ne 9[/col][/row][/table] .ft B .nf .5 svc_getreqset(rdfds) fd_set *rdfds; .fi .ft R [table][row][col] [/col][col]Cette routine n'est intéressante que si l'implémentation d'un service n'appelle pas [b]svc_run() ,[/b] mais emploie à la place un traitement personnalisé des évènements asynchrones. On l'invoque lorsque l'appel-système [b]select[/b] a déterminé qu'une requête [size=6]RPC[/size] est arrivée sur l'une des sockets RPC. [i]rdfds[/i] est le masque de bits des descripteurs de fichiers en résultant. La routine revient lorsque toutes les sockets associées avec les valeurs de [i]rdfds[/i] ont été servies. [b][/b] .if t .ne 6[/col][/row][/table] .ft B .nf .5 svc_getreq(rdfds) int rdfds; .fi .ft R [table][row][col] [/col][col]Similaire à [b]svc_getreqset() ,[/b] mais limitée à 32 descripteurs. Cette interface est rendue obsolète par [b]svc_getreqset() .[/b] [b][/b] .if t .ne 17[/col][/row][/table] .ft B .nf .5 svc_register(xprt, prognum, versnum, dispatch, protocol) s-1SVCXPRTs0 *xprt; u_long prognum, versnum; void (*dispatch) (); u_long protocol; .fi .ft R [table][row][col] [/col][col]Associer [i]prognum[/i] et [i]versnum[/i] avec la procédure de distribution [b]dispatch .[/b] Si [i]protocol[/i] vaut zéro, le service n'est pas enregistré avec le service [b]portmap .[/b] Si [i]protocol[/i] est non-nul, alors l'association entre le triplet [i][ prognum , versnum , protocol][/i] et [b][/b]%xprt->xp_port est établie par l'intermédiaire du service [b]portmap[/b] local (en général [i]protocol[/i] vaut zéro, .B [size=6]IPPROTO_UDP[/size] ou .B [size=6]IPPROTO_TCP[/size] ). La procédure [i]dispatch[/i] a la forme suivante[table][row][col] [/col][col] .ft B .nf dispatch(request, xprt) struct svc_req *request; s-1SVCXPRTs0 *xprt; .ft R .fi[/col][/row][/table][/col][/row][/table] [table][row][col] [/col][col]La routine [b]svc_register()[/b] renvoie 1 si elle réussit et 0 sinon. [b][/b] .if t .ne 6[/col][/row][/table] .ft B .nf .5 svc_run() .fi .ft R [table][row][col] [/col][col]Cette routine ne revient jamais. Elle attend l'arrivée de requêtes [size=6]RPC[/size] et appelle les procédures de service appropriées en utilisant [b]svc_getreq() .[/b] Cette procédure est la plupart du temps en attente autour d'un appel-système [b]select() .[/b] [b][/b] .if t .ne 9[/col][/row][/table] .ft B .nf .5 svc_sendreply(xprt, outproc, out) s-1SVCXPRTs0 *xprt; xdrproc_t outproc; char *out; .fi .ft R [table][row][col] [/col][col]Appelée par une routine de distribution de services [size=6]RPC[/size] pour envoyer le résultat d'un appel de procédure distante. L'argument [i]xprt[/i] est le descripteur de transport associé à la requête, [i]outproc[/i] est la routine [size=6]XDR[/size] utilisée pour encoder les résultats, et [i]out[/i] est l'adresse des résultats. Cette routine renvoie 1 si elle réussit, et 0 sinon. [b][/b] .if t .ne 7[/col][/row][/table] .ft B .nf .5 void svc_unregister(prognum, versnum) u_long prognum, versnum; .fi .ft R [table][row][col] [/col][col]Supprimer toute association du doublet [i][ prognum , versnum ][/i] vers les routines de distribution, et du triplet [i][ prognum , versnum , *][/i] vers le numéro de port. [b][/b] .if t .ne 9[/col][/row][/table] .ft B .nf .5 void svcerr_auth(xprt, why) s-1SVCXPRTs0 *xprt; enum auth_stat why; .fi .ft R [table][row][col] [/col][col]Appelée par une routine de distribution de service qui refuse d'exécuter un appel de procédure distante à cause d'une erreur d'authentification. [b][/b] .if t .ne 7[/col][/row][/table] .ft B .nf .5 void svcerr_decode(xprt) s-1SVCXPRTs0 *xprt; .fi .ft R [table][row][col] [/col][col]Appelée par une routine de distribution de service qui n'arrive pas à décoder ses arguments. Voir aussi [b]svc_getargs() .[/b] [b][/b] .if t .ne 7[/col][/row][/table] .ft B .nf .5 void svcerr_noproc(xprt) s-1SVCXPRTs0 *xprt; .fi .ft R [table][row][col] [/col][col]Appelée par une routine de distribution de service qui n'implémente pas le numéro de procédure que l'appelant réclame. [b][/b] .if t .ne 7[/col][/row][/table] .ft B .nf .5 void svcerr_noprog(xprt) s-1SVCXPRTs0 *xprt; .fi .ft R [table][row][col] [/col][col]Appelée quand le programme désiré n'est pas enregistré dans le service [size=6]RPC.[/size] L'implémentation d'un service n'a normalement pas besoin de cette routine. [b][/b] .if t .ne 7[/col][/row][/table] .ft B .nf .5 void svcerr_progvers(xprt) s-1SVCXPRTs0 *xprt; .fi .ft R [table][row][col] [/col][col]Appelée quand le numéro de version du programme désiré n'est pas enregistré dans le service [size=6]RPC.[/size] L'implémentation d'un service n'a normalement pas besoin de cette routine. [b][/b] .if t .ne 7[/col][/row][/table] .ft B .nf .5 void svcerr_systemerr(xprt) s-1SVCXPRTs0 *xprt; .fi .ft R [table][row][col] [/col][col]Appelée par une routine de distribution de service lorsqu'elle détecte une erreur système non couverte par un protocole. Par exemple si un service ne peut plus allouer de place, il peut appeler cette routine. [b][/b] .if t .ne 8[/col][/row][/table] .ft B .nf .5 void svcerr_weakauth(xprt) s-1SVCXPRTs0 *xprt; .fi .ft R [table][row][col] [/col][col]Appelée par une routine de distribution de service qui refuse d'exécuter un appel de procédure distante à cause d'un manque de paramètres d'authentification. La routine appelle [b]svcerr_auth(xprt, s-1AUTH_TOOWEAKs0) .[/b] [b][/b] .if t .ne 11[/col][/row][/table] .ft B .nf .5 s-1SVCXPRTs0 * svcfd_create(fd, sendsize, recvsize) int fd; u_int sendsize; u_int recvsize; .fi .ft R [table][row][col] [/col][col]Créer un service au-dessus de n'importe quel descripteur ouvert. Typiquement ces descripteurs sont des sockets pour un protocole connecté comme [size=6]TCPs0.[/size] [i]sendsize[/i] et [i]recvsize[/i] indiquent les tailles pour les buffers d'émission et de réception. Si ces tailles valent zéro, une valeur optimale est choisie. [b][/b] .if t .ne 10[/col][/row][/table] .ft B .nf .5 s-1SVCXPRTs0 * svcraw_create() .fi .ft R [table][row][col] [/col][col]Cette routine crée un simili transport de service [size=6]RPC[/size] vers lequel il renvoie un pointeur. Le transport est en fait un buffer au sein de l'espace d'adressage du processus. Le client [size=6]RPC[/size] correspondant doit donc résider dans le même espace d'adresse. Voir [b]clntraw_create() .[/b] Cela permet de simuler une [size=6]RPC[/size] et de mesurer la surcharge des procédures [size=6]RPC[/size] comme les temps d'aller-retour sans interférence due au noyau. Cette routine renvoie [size=6]NULL[/size] si elle échoue. [b][/b] .if t .ne 11[/col][/row][/table] .ft B .nf .5 s-1SVCXPRTs0 * svctcp_create(sock, send_buf_size, recv_buf_size) int sock; u_int send_buf_size, recv_buf_size; .fi .ft R [table][row][col] [/col][col]Cette routine crée un transport de service [size=6]RPC[/size] basé sur [size=6]TCP/IP[/size] sur lequel elle renvoie un pointeur. Il est associé avec la socket [b]sock ,[/b] qui peut être [b]s-1RPC_ANYSOCKs0 ,[/b] auquel cas une nouvelle socket est créée. Si la socket n'est pas associée à un port [size=6]TCP[/size] local, cette routine l'associe à un port quelconque. Après réussite, [b][/b]%xprt->xp_sock est le descripteur de la socket de transport, et [b][/b]%xprt->xp_port est le numéro de port. Cette routine renvoie [size=6]NULL[/size] si elle échoue. Comme les [size=6]RPC[/size] basée sur [size=6]TCP[/size] utilisent des entrées-sorties avec buffer, les utilisateurs peuvent fixer la taille des buffers. Une taille nulle implique l'allocation automatique de buffers de tailles optimales. [b][/b] .if t .ne 11[/col][/row][/table] .ft B .nf .5 s-1SVCXPRTs0 * svcudp_bufcreate(sock, sendsize, recosize) int sock; .fi .ft R [table][row][col] [/col][col]Cette routine crée un transport de service [size=6]RPC[/size] basé sur [size=6]UDP/IP[/size] et renvoie un pointeur dessus. Le transport est associé avec la socket [b]sock ,[/b] qui peut être [b]s-1RPC_ANYSOCKs0 ,[/b] auquel cas une nouvelle socket est créée. Si la socket n'est pas associée à un port [size=6]UDP[/size] local, cette routine l'associe à un port quelconque. Après réussite, [b][/b]%xprt->xp_sock est le descripteur de transport, et [b][/b]%xprt->xp_port est le numéro de port. Cette routine renvoie [size=6]NULL[/size] si elle échoue.[/col][/row][/table] [table][row][col] [/col][col]Ceci permet à l'utilisateur de préciser la taille maximale d'un paquet [size=6]UDP[/size] en émission ou en réception de messages [size=6]RPC.[/size] [b][/b] .if t .ne 7[/col][/row][/table] .ft B .nf .5 s-1SVCXPRTs0 * svcudp_create(sock) int sock; .fi .ft R [table][row][col] [/col][col]Cet appel est équivalent à [i]svcudp_bufcreate(sock,SZ,SZ)[/i] avec une taille [i]SZ[/i] par défaut. [b][/b] .if t .ne 7[/col][/row][/table] .ft B .nf .5 xdr_accepted_reply(xdrs, ar) s-1XDRs0 *xdrs; struct accepted_reply *ar; .fi .ft R [table][row][col] [/col][col]Utilisée pour encoder les messages de réponse [size=6]RPC.[/size] Cette routine est utile pour les programmeurs qui désirent engendrer des messages de style s-1RPCs0 sans employer le service [size=6]RPC[/size] complet. [b][/b] .if t .ne 7[/col][/row][/table] .ft B .nf .5 xdr_authunix_parms(xdrs, aupp) s-1XDRs0 *xdrs; struct authunix_parms *aupp; .fi .ft R [table][row][col] [/col][col]Utilisée pour décrire les identités [size=6]UNIX.[/size] Cette routine est utile pour les programmeurs qui veulent engendrer ces identités sans utiliser le système [size=6]RPC[/size] d'authentification. [b][/b] .if t .ne 7[/col][/row][/table] .ft B .nf .5 void xdr_callhdr(xdrs, chdr) s-1XDRs0 *xdrs; struct rpc_msg *chdr; .fi .ft R [table][row][col] [/col][col]Utilisée pour créer les entêtes de message [size=6]RPC.[/size] Cette routine est utile pour les programmeurs qui désirent engendrer des messages de style [size=6]RPC[/size] sans employer le service [size=6]RPC[/size] complet. [b][/b] .if t .ne 7[/col][/row][/table] .ft B .nf .5 xdr_callmsg(xdrs, cmsg) s-1XDRs0 *xdrs; struct rpc_msg *cmsg; .fi .ft R [table][row][col] [/col][col]Utilisée pour créer les messages d'appel [size=6]RPC.[/size] Cette routine est utile pour les programmeurs qui désirent engendrer des messages de style [size=6]RPC[/size] sans employer le service [size=6]RPC[/size] complet. [b][/b] .if t .ne 7[/col][/row][/table] .ft B .nf .5 xdr_opaque_auth(xdrs, ap) s-1XDRs0 *xdrs; struct opaque_auth *ap; .fi .ft R [table][row][col] [/col][col]Utilisée pour créer les informations d'authentification [size=6]RPC.[/size] Cette routine est utile pour les programmeurs qui désirent engendrer des messages de style [size=6]RPC[/size] sans employer le service [size=6]RPC[/size] complet. [b][/b] .if t .ne 7[/col][/row][/table] .ft B .nf .5 xdr_pmap(xdrs, regs) s-1XDRs0 *xdrs; struct pmap *regs; .fi .ft R [table][row][col] [/col][col]Utilisée pour créer les paramètres des divers procédures [b]portmap .[/b] Cette routine est utile pour les programmeurs qui désirent créer ces paramètres sans utiliser l'interface [b]pmap .[/b] [b][/b] .if t .ne 7[/col][/row][/table] .ft B .nf .5 xdr_pmaplist(xdrs, rp) s-1XDRs0 *xdrs; struct pmaplist **rp; .fi .ft R [table][row][col] [/col][col]Utilisée pour créer la liste des associations des ports. Cette routine est utile pour les programmeurs qui désirent créer ces paramètres sans utiliser l'interface [b]pmap .[/b] [b][/b] .if t .ne 7[/col][/row][/table] .ft B .nf .5 xdr_rejected_reply(xdrs, rr) s-1XDRs0 *xdrs; struct rejected_reply *rr; .fi .ft R [table][row][col] [/col][col]Utilisée pour créer les messages de rejet [size=6]RPC.[/size] Cette routine est utile pour les programmeurs qui désirent engendrer des messages de style [size=6]RPC[/size] sans employer le service [size=6]RPC[/size] complet. [b][/b] .if t .ne 8[/col][/row][/table] .ft B .nf .5 xdr_replymsg(xdrs, rmsg) s-1XDRs0 *xdrs; struct rpc_msg *rmsg; .fi .ft R [table][row][col] [/col][col]Utilisée pour créer les messages de réponse [size=6]RPC.[/size] Cette routine est utile pour les programmeurs qui désirent engendrer des messages de style [size=6]RPC[/size] sans employer le service [size=6]RPC[/size] complet. [b][/b] .if t .ne 8[/col][/row][/table] .ft B .nf .5 void xprt_register(xprt) s-1SVCXPRTs0 *xprt; .fi .ft R [table][row][col] [/col][col]Après la création d'un descripteur [size=6]RPC[/size] de transport, il doit être enregistré dans le service [size=6]RPC.[/size] Cette routine modifie la variable globale [b]svc_fds() .[/b] L'implémentation d'un service ne nécessite pas cette routine habituellement. [b][/b] .if t .ne 8[/col][/row][/table] .ft B .nf .5 void xprt_unregister(xprt) s-1SVCXPRTs0 *xprt; .fi .ft R [table][row][col] [/col][col]Avant qu'un descripteur [size=6]RPC[/size] de transport soit détruit, il doit se désinscrire du service [size=6]RPC.[/size] Cette routine modifie la variable globale [b]svc_fds() .[/b] L'implémentation d'un service ne nécessite pas cette routine habituellement.[/col][/row][/table] [size=18] [b]Voir aussi[/b] [/size] [b]rpc_secure (3N),[/b] [b]xdr (3N)[/b] [b][/b] Les manuels suivants :[table][row][col] [/col][col] .ft I Remote Procedure Calls: Protocol Specification [b][/b] Remote Procedure Call Programming Guide [b][/b] rpcgen Programming Guide [b][/b] .ft R[/col][/row][/table] [b]s-1RPCs0: Remote Procedure Call Protocol Specification ,[/b] [size=6]RFC1050, Sun Microsystems, Inc.,[/size] [size=6]USC-ISIs0.[/size] [size=18] [b]Traduction[/b] [/size] Christophe Blaess, 2000-2003.
Fichier
Forum
-
Derniers messages
Bavardages
Aujourd'hui, je rénove ou je construis ^^
Software
problème sur windows 10
Réseaux et Télécom
Administrateur Réseau - Cisco
Réseaux et Télécom
Problème wifi (POE)
Software
Postfix - Need help
Bavardages
Oh râge oh désespoir !
Programmation
Enregistrement client et envoi mail
Software
SÉCURITÉ MACBOOK
Hardware
conseil matos réseau?
Hardware
nVidia Shield Android TV
Actualités
-
Archives
Matériel
Nvidia prévient d'une pénurie de GPU ce trimestre, avec une reprise début 2025
Les Technos
Les Technos #469 : Un jour sans fin
Jeux Vidéos
Test Farming Simulator 25 (PS5) - Des innovations intéressantes mais des performances à revoir
Matériel
Qualcomm souhaite réduire davantage les prix des PC Windows basés sur ARM
Tablettes
Finalement, Google préparerait une nouvelle tablette mais la Pixel Tablet 2 serait abandonnée
Ada
CSS
Cobol
CPP
HTML
Fortran
Java
JavaScript
Pascal
Perl
PHP
Python
SQL
VB
XML
Anon URL
DailyMotion
eBay
Flickr
FLV
Google Video
Google Maps
Metacafe
MP3
SeeqPod
Veoh
Yahoo Video
YouTube
6px
8px
10px
12px
14px
16px
18px
Informaticien.be
- © 2002-2024
Akretio
SPRL - Generated via
Kelare
The Akretio Network:
Akretio
-
Freedelity
-
KelCommerce
-
Votre publicité sur informaticien.be ?