= Chiamate a metodi remoti = Nel programma Netsukuku esistono delle funzioni (metodi) richiamabili da remoto attraverso il meccanismo RPC (vedi il [[../ModuloRPC|modulo RPC]]). Si può specificare quali metodi di una certa classe sono ''remotable''. A partire da un certo oggetto (istanza di una classe) chiamato root_instance, che viene specificato al momento dell'avvio del {{{MicroTCPServer}}} e dei {{{MicroUDPServer}}} (un UDP per ogni scheda di rete), tutti i suoi attributi si possono "accedere" da remoto. E per ogni attributo che contiene un oggetto, di nuovo tutti i suoi attributi si possono "accedere" da remoto. Dicendo che "si può accedere" si intende che si possono richiamare i suoi metodi. Bisogna poi vedere quali di questi metodi si possono veramente richiamare. Questo si controlla appunto specificando quali metodi di una data classe sono remotable. == Oggetto radice e suoi attributi == La root_instance fornita dal demone di Netsukuku è l'unica istanza della [[../ClasseNtkNode|classe NtkNode]]. Tra i suoi attributi sono: . {{{self.radar = radar.Radar(...)}}} . {{{self.neighbour = self.radar.neigh}}} . {{{self.maproute = maproute.MapRoute(...)}}} . {{{self.etp = qspn.Etp(...)}}} . {{{self.p2p = p2p.P2PAll(...)}}} . {{{self.coordnode = coord.Coord(...)}}} . {{{self.hook = hook.Hook(...)}}} In particolare l'attributo {{{p2p}}} è un oggetto {{{P2PAll}}}. Questo ha un numero dinamico di attributi interessanti, perché richiamando un suo attributo con nome {{{PID_}}}''{{{n}}}'' (dove ''{{{n}}}'' è un qualsiasi intero) si ottiene un oggetto della classe {{{P2P}}}. I {{{TCPClient}}} sono memorizzati sull'attributo {{{ntkd}}} dell'oggetto {{{Neigh}}}. <
> Gli oggetti {{{Neigh}}} si passano insieme agli eventi {{{NEIGH_NEW}}}, {{{NEIGH_REM_CHGED}}}, {{{NEIGH_DELETED}}} oppure si richiedono alla istanza locale di {{{Neighbour}}} con il metodo {{{neigh_list}}}. Quindi sul codice si trovano pezzi simili a questo: <
> {{{ neigh.ntkd.etp.etp_exec(...)}}} <
> '''{{{neigh}}}''' è un oggetto {{{Neigh}}} ricevuto attraverso un evento. Attraverso l'attributo '''{{{ntkd}}}''' esegue una chiamata RPC. La root_instance (sull'host remoto) è l'oggetto {{{NtkNode}}}, il quale ha un attributo '''{{{etp}}}''' che è una istanza della classe {{{Etp}}}. La classe {{{Etp}}} ha la funzione remotable '''{{{etp_exec}}}'''. La chiamata quindi risulta corretta. Altro esempio potrebbe essere: <
> {{{ n.ntkd.p2p.PID_12.msg_send(...)}}} <
> '''{{{n}}}''' è un oggetto {{{Neigh}}} richiesto alla istanza locale di {{{Neighbour}}}. Attraverso l'attributo '''{{{ntkd}}}''' esegue una chiamata RPC. La root_instance (sull'host remoto) è l'oggetto {{{NtkNode}}}, il quale ha un attributo '''{{{p2p}}}''' che è una istanza della classe {{{P2PAll}}}. La classe {{{P2PAll}}} ha un attributo (dinamico) '''{{{PID_12}}}''' che è una istanza della classe {{{P2P}}}. La classe {{{P2P}}} ha la funzione remotable '''{{{msg_send}}}'''. La chiamata quindi risulta corretta. Invece il {{{BcastClient}}} viene istanziato e memorizzato sull'attributo {{{broadcast}}} dell'oggetto {{{Radar}}}. <
> Oppure si può istanziare un {{{BcastClient}}} all'abbisogna. Quindi sul codice si trovano pezzi simili a questo: <
> {{{ self.broadcast.radar.reply(...)}}} <
> '''{{{self.broadcast}}}''' è un oggetto {{{BcastClient}}} attraverso il quale si esegue una chiamata RPC ''in broadcast''. La root_instance (su tutti gli host Netsukuku della LAN) è l'oggetto {{{NtkNode}}}, il quale ha un attributo '''{{{radar}}}''' che è una istanza della classe {{{Radar}}}. La classe {{{Radar}}} ha la funzione remotable '''{{{reply}}}'''. La chiamata quindi risulta corretta. == Parametri formali speciali == '''''TODO''': spiegazione del _rpc_caller'' == Elenco dei metodi remotable == === Modulo radar === . ~+{{{class Radar(object)}}}+~ . {{{reply Riceve _rpc_caller}}} . {{{time_register Riceve _rpc_caller}}} . ~+{{{class Neighbour(object)}}}+~ . {{{ip_change}}} === Modulo route === . ~+{{{class MapRoute(Map)}}}+~ . {{{free_nodes_nb}}} === Modulo qspn === . ~+{{{class Etp}}}+~ . {{{etp_exec}}} === Modulo hook === . ~+{{{class Hook(object)}}}+~ . {{{communicating_vessels}}} . {{{highest_free_nodes}}} === Modulo p2p === . ~+{{{class P2P(RPCDispatcher)}}}+~ . {{{partecipant_add}}} . {{{msg_send}}} . ~+{{{class P2PAll(object)}}}+~ . {{{pid_getall}}} === Modulo coord === . ~+{{{class MapCache(Map)}}}+~ . {{{map_data_merge}}} . ~+{{{class Coord(P2P)}}}+~ . {{{going_out}}} . {{{going_out_ok}}} . {{{going_in}}}