PB173 - Binární programování Linux XII. Komunikace mezi procesy, část 2 Jiri Slabý Fakulta informatiky Masarykova univerzita 10. 12. 2013 Jiri Slabý (Fakulta informatiky, MU) PB173/03 10. 12. 2013 1 / 14 Komunikace mezi procesy Alespoň 2 procesy, které chtějí komunikovat Minule • Roura (pipe) a Sdílená paměť (mmap) a Plná meziprocesová komunikace (IPC) Dnes O Netlink O RPC • RPC rozhraní pro server o RPC rozhraní pro klienta • XDR Jiri Slabý (Fakulta informatiky, MU) PB173/03_10.12.2013 2/ 14 Sekce 1 Netlink Jiri Slabý (Fakulta informatiky, MU) PB173/03 10. 12. 2013 3/14 Netlink • Protokol pro komunikaci s jádrem • Standardní socket (sys/socket.h) • Ale umožňuje i komunikaci mezi procesy • Adresování: struct sockaddr_nl (linux/netlink.h) • nl_family = af_netlink • ni_pid je většinou číslo procesu • Vytvoření: socket(AF_NETLINK, S0CK_RAW, NETLINK_USERSOCK) • Server • Provede bind s nastaveným sockaddr_ni.ni_pid • Potom poslouchá pomocí recvmsg • Klient • Posílá pomocí sendmsg » Zpráva:struct nlmsghdr o Operace: nlmsg_data (data), nlmsg_paylqad (délka), ... Jiri Slabý (Fakulta informatiky, MU) PB173/03 10. 12. 2013 4/14 Úkol Vytvoření netlink komunikace (bez hlaviček, jen char *) O Otevřete Si kostru V pbl73-bin/12/netlink.c O Doplňte server a klient (tři TODO) Q V serveru proveďte: • binds nastaveným sockaddr_nl.nl_pid • A v cyklu opakujte recv a write na standardní výstup O V klientovi proveďte: • sendto nějakých dat O Vyzkoušejte • Vypsaný PID použijte jako adresu v klientovi Jiri Slabý (Fakulta informatiky, MU) PB173/03 10. 12. 2013 5/14 Sekce 2 RPC Jiri Slabý (Fakulta informatiky, MU) PB173/03 10. 12. 2013 6/14 RPC • Vzdálené volání procedur • Volání funkcí přes síť • UDP nebo TCP • Předávání parametrů a návratových hodnot • Využití např. v NFS • Portmapper • Lokální služba • Mapuje číslo „programu" (funkce), jeho verzi a protokol na funkce • Registrovaná čísla v /etc/rpc Jiri Slabý (Fakulta informatiky, MU) PB173/03 10. 12. 2013 7/14 RPC rozhraní pro server • rpc/rpc.h, man 3 rpc • Vytvoření spojení: svctcp_create, svcudp_create • Parametr: socket nebo rpc_anysqck • Registrace volatelného „programu" (funkce): svc_register • Registruje program u portmapperu pomocí pmap_set • Viditelné v rpcinf o -p • Je zvykem před tím volat pmap_unset 9 Zruší případnou zastaralou registraci • Volá se funkce udaná parametrem dispatch • Parametr svc_req->rq_proc určuje funkcionalitu o Obslužná smyčka: svc_run Jiri Slabý (Fakulta informatiky, MU) PB173/03 10. 12. 2013 8/14 RPC rozhraní pro server Příklad #define RUSERSPROG 0x40000000 #define RUSERSVERS 1 static void dispatch(struct svc_req *req, SVCXPRT *xprt) { printf ("request %ld\n", req->rq_proc); } int main(void) { SVCXPRT *xprt = svctcp_create(RPC_ANYSOCK, 0, 0); svc_register(xprt, RUSERSPROG, RUSERSVERS, dispatch, IPPRCTO_TCP); svc_run(); return 0; } Jiri Slabý (Fakulta informatiky, MU) PB173/03 10. 12. 2013 9/14 Úkol Vytvoření RPC serveru O Vytvořte Si TCP spojení (svctcp_create a RPC_ANYSOCK) Q Zvolte si čísla programu a verze • Vyhněte se číslům programů z /etc/rpc O Zrušte stará mapování (pmap_unset) O Registrujte službu (svc_register) • V dispatch funkci proveďte Výpis svc_req->rq_proc O Spusťte smyčku (svc_run) O Spusťte program a Za předpokladu, že běží portmapper Jiri Slabý (Fakulta informatiky, MU) PB173/03 10. 12. 2013 10/14 RPC rozhraní pro klienta • Vytvoření spojení: clnt_create o Stroj, protokol a číslo programu+verze • Zrušení spojení: clnt_destroy a Zavolání programu (funkce): clnt_call • 2. parametr do dispatch jako svc_req->rq_proc o 3. a 5. parametr: kódovací funkce (zatím xdr_void) • 4. a 6. parametr: parametry vzdálené funkce (zatím null) • Timeout: čas na odpověď Příklad struct timeval tout ={1,0}; CLIENT *cln = clnt_create("localhost", RUSERSPROG, RUSERSVERS, "tcp"); clnt_call (cln, 1, (xdrproc_t)xdr_void, NULL, (xdrproc_t)xdr_void, NULL, tout); clnt_destroy(cln); Jiri Slabý (Fakulta informatiky, MU) PB173/03 10. 12. 2013 11 / 14 Úkol Vytvoření RPC klienta O Vytvořte si TCP spojení na localhost (cint_create) • Použijte čísla zvolená v serveru O Zavolejte několikrát cint_caii • S různým 2. parametrem O Spusťte program • Za předpokladu, že server běží Jiri Slabý (Fakulta informatiky, MU) PB173/03 10.12.2013 12/14 RPC a parametry XDR • rpc/xdr.h, man 3 xdr • Funkce k přenositelnému zakódování dat • xdr_void • xdr_char, xdr_short, xdr_int, xdr_long • xdr_float, xdr_double • xdr_string, xdr_array » ... • Klient • Funkce shora jako 3. a 5. parametr pro clnt_call • Ukazatele na proměnné potom jako 4. a 6. • Server • V dispatch: svc_getargs • A lze také odpovědět na zprávu: svc_sendrepiy Jiri Slabý (Fakulta informatiky, MU) PB173/03 10.12.2013 13/ 14 Úkol Příklad /* server */ int in; svc_getargs(xprt, (xdrproc_t)xdr_int, (char*)&in); in++; svc_sendreply(xprt, (xdrproc_t)xdr_int, (char*)&in); /* client */ int in = 5; clnt_call (cln, 0, (xdrproc_t)xdr_int, (char *)&in, (xdrproc_t)xdr_int, (char *)&in, tout); /* ' in' is 6 now (unless timed out) */ Předávání parametrů O V serveru vytvořte program • Vezme int, vynásobí 10 a vrátí long O Z klienta zavolejte O Vyzkoušejte Jiri Slabý (Fakulta informatiky, MU) PB173/03 10.12.2013 14/14