23

23



Komunikacja między procesami w UnUie

Tabela 9.10. Zestawienie informacji o funkcji rpc_broadcast

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.

Program 9.8. Program broad.c wysyła żądanie rozsyłania

ł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


Wyszukiwarka

Podobne podstrony:
Komunikacja między procesami w UnixieTabela 9.9. Zestawienie informacji o funkcji clnt_destroy Pli
Komunikacja między procesami w Unlxle Funkcja rexec wymaga sześciu argumentów. Pierwszym jest wskaźn
Komunikacja między procesami w Unixiedo naszych badań wybierzemy tylko nieliczne. Zestawienie argume
Komunikacja między procesami w Unixie (svc_req *) Client);    Wywołać funkcję
image001 6. Uzupełnić tabelę nazwami mechanizmów komunikacji między procesami w taki sposób, żeby wł
DSC00273 (6) 6. Uzupełnić tabelę nazwami mechanizmów komunikacji między procesami w taki sposób, żeb
DSC00277 (9) 6. Uzupełnić tabelę nazwami mechanizmów komunikacji między procesami w taki sposób, żeb
1 Komunikacja między procesami w UnixleĆwiczenie 8-8 Czy wynik działania programu 8.6 pozostanie tak
Komunikacja między procesami w Unixie_ ■    Jeżeli klient wysunie kilka identycznych
Komunikacja między procesami w Unixie powinno się używać w odniesieniu do poleceń, które nie prowadz
Komunikacja między procesami w UninieProgram 9.2. Prosty program w C wyświetlający krótki tekst /* *
Komunikacja między procesami w Unixle Plik hello. h utworzony przez rpcgen będzie włączany do kodu p
Komunikacja między procesami w Unixie i argv. W sekcji deklaracyjnej klienta rezerwowane jest miejsc
Komunikacja między procesami w Uninie Semantyka i zastosowania pliku netconfig wykraczają poza ramy
Komunikacja między procesami w Unixle łinclude "hello.h*    /* wygenerowany prze
Komunikacja między procesami w Unixie Jeżeli proces zostanie uruchomiony lokalnie, zostanie również
Komunikacja między procesami w Unixie int * print_hello_l(void *argp, CLIENT *clnt) { static int
Komunikacja między procesami w Unixie    _ rzone przez rpcgen. Plik f act_client. c t

więcej podobnych podstron