Pliki włączane |
<rpc/rpc.h> |
Rozdział podręcznika |
3N | |
Prototyp 4 |
enum clnt stat rpc_broadcast ( const u_long prognum, const u_long versnum, const u_long procnum, const xdrproc_t inproc, const caddr_t in, const xdrproc_t outproc, caddr_t out, const resultproc_t eachresult, const char *nettype ); | |||
Zwracana |
Sukces |
Niepowodzenie |
Czy zmienia errno | |
wartość |
Wartość typu wyliczanego RFC_SUCCESS informująca o powodzeniu wywołania rozsyłania |
Komunikat o błędzie generuje clnt_per-ror |
Tak |
Funkcja rpc_broadcast jest podobna w naturze do rpc_call. Pierwsze trzy argumenty to numery programu, wersji i procedury danej usługi. Parametry inproc i in wskazują procedurę kodującą oraz adres jej argumentów, a outproc i out — procedurę dekodującą oraz adres miejsca, w którym umieści ona wynikowe dane (jeżeli zakończy się bezbłędnie). Funkcja rpc_broadcast za każdym razem, kiedy otrzyma odpowiedź, wywoła funkcję wskazaną parametrem eachresult. Funkcja ta ma następujący prototyp:
bool_t eachresult (
caddr_t out,
const struct netbuf *addr, const struct netconfig *netconf
);
przy czym parametr out jest taki sam jak ten z funkcji rpc_broadcast, parametr addr to wskaźnik na strukturę netbuf zawierającą informaqe o systemie, który udzielił odpowiedzi, a netconf to wskaźnik na strukturę z konfiguracją sieci (netconfig) protokołu transportowego tego systemu. Jeżeli tylko eachresult zwróci 0 (FALSE), funkcja rpc_bro-adcast będzie kontynuować czekanie na dalsze odpowiedzi. Jednak funkcja rpc_broad-cast traci w końcu cierpliwość i przerywa działanie (użytkownik nie ma wpływu na długość czasu oczekiwania). Parametr nettype jest używany do pobierania typu sieci (patrz tabela 9.4). Ustawiony na NULL skutkuje wywołaniem domyślnym dla typu net-path.
Zastosowanie funkcji rcp_broadcast demonstruje program 9.8.
łinclude <stdio.h> łinclude <string.h> łinclude <unistd.h> łinclude <stdlib.h> łinclude <cty{>e.h> łinclude <rpc/rpc.h> łinclude <rpc/rpcent.h> łinclude <netdir.h>
static bool_t
idr, struct netconfig * netconf) (
/* odwzoruj na uniwers. */ != NULL) ( /* format adresu */
/* przejdź do 4. kropy */
/* podziel na 2 części ’/
/* MSB numeru portu */
/* LSB numeru portu */
6d\n", host, pnum);
uniwersalny adres sieciowy\n");
who_responded(void *out, struct netbuf * char *host, *port;
int i-0, pnum - 0;
if ((host - taddr2uaddr(netconf, addr)) port = host; while (port SS i++ < 4)
port - strchr(port, ".") + 1;
*(port - 1) = 0;
pnum - atoi(port)*256;
port = strchr(port,
pnum += atoi(port);
fprintf(stderr, "host %+12s\tport %
return (FALSE);
fprintf (stderr, "Błąd translacji na exit(4);
maindnt argc, char *argv[]) ( enum clnt_stat rpc_stat; u_long program_number, version;
struct rpcent *rpc_entry; if (argc !- 3) (
fprintf (stderr, "Składnia: %s usługa_RPC (nazwa numer] wers ja\n", *arc%') ; exit (1);
/* zignoruj własna nazwę programu */ /* sprawdź, czy podano numer */
/* jeśli tak, użyj go, w przeciwnym razi /* uzyskaj info o pozycji RPC */
++argv;
if (isdigit(**argv))
programnumber - atoi(*argv); else (
if ((rpc_entry = getrpcbyname(*argv)) — NULL) ( fprintf(stderr, "Unknown service: %s\n", *argv) ^ r>\ •
programnumber = rpc_entry->r_number; /* numer programu dla usługi */
ł
++argv; /* przejdź do numeru wersji */
version - atol(*argv);
rpc_stat - rpcjbroadcast(program_number, yersion, NULLPROC,
xdr_void, (caddr_t) NULL, ,
xdr_void, (caddr_t) NULL,
(resultproc_t) whoresponded, (char *)NULL);
287