<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-35347839</atom:id><lastBuildDate>Sat, 14 Sep 2024 05:18:39 +0000</lastBuildDate><category>Corba</category><category>Pnrp</category><category>Teredo</category><category>DHT</category><title>Middlewares</title><description></description><link>http://middlewares.blogspot.com/</link><managingEditor>noreply@blogger.com (Ska)</managingEditor><generator>Blogger</generator><openSearch:totalResults>8</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink="false">tag:blogger.com,1999:blog-35347839.post-1703033795797503762</guid><pubDate>Thu, 21 Feb 2008 13:00:00 +0000</pubDate><atom:updated>2008-02-24T16:19:01.280+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Teredo</category><title>Debug Teredo (netsh)</title><description>&lt;blockquote&gt;&lt;/blockquote&gt;In questo post vediamo come possiamo testare il funzionamento del Teredo client utilizzando la shell di windows &lt;span style=&quot;font-style: italic;&quot;&gt;netsh&lt;/span&gt;, con la quale è possibile gestire tutto il networking di Windows.&lt;br /&gt;Per prima cosa è necessario controllare lo stato della lista dei cloud è vedere se in questa è presente la cloud Global_; questo è possibile tramite il comando:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;netsh p2p pnrp cloud show list&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Se la cloud Global_ non è presente bisognerà controllare lo stato di Teredo, in quanto la causa di tale mancanza probabilmente è da attribuire alla fatto che il server Teredo non è riuscito ad assegnare un indirizzo IPv6; quindi per controllare lo stato di Teredo:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;netsh interface ipv6 show teredo&lt;/span&gt;     in Xp&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;netsh interface teredo show state&lt;/span&gt;    in Vista&lt;br /&gt;&lt;br /&gt;Se lo stato è risulta probe, vuol dire che il client Teredo sta cercando di comunicare con il server Teredo per ottenere un indirizzo IPv6; se invece si riscontra lo stato di dormant o qualified allora il client sta funzionando correttamente; se è unreachable, bisognerà controllare che qualche firewall non blocchi la porta 3544; ed infine se si trova come stato &quot;client is a managed network&quot;, probabilmente il client Teredo si trova all&#39; interno di una rete aziendale gestita, e dovremo settare la modalità di funzionamento del client su &quot;enterprise&quot; con il seguente comando:&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;netsh interface ipv6 set teredo type=enterpriseclient    &lt;/span&gt;in Xp&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;netsh interface teredo set state enterpriseclient             &lt;/span&gt;in Vista&lt;br /&gt;&lt;br /&gt;Se invece nella lista delle cloud, Global_ è presente, ma si trova nello stato virtual, vuol dire che ancora non è finito il processo di inizializzazione e si può provare a dare il comando&lt;span style=&quot;font-style: italic;&quot;&gt;:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-style: italic;&quot;&gt;netsh p2p pnrp cloud start Global_&lt;/span&gt;&lt;br /&gt;&lt;i&gt;&lt;/i&gt;</description><link>http://middlewares.blogspot.com/2008/02/debug-teredo-netsh.html</link><author>noreply@blogger.com (Ska)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-35347839.post-1588510238481084607</guid><pubDate>Wed, 20 Feb 2008 09:58:00 +0000</pubDate><atom:updated>2008-02-21T14:33:37.246+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Teredo</category><title>Teredo</title><description>Teredo è un protocollo di tunneling che consente di fornire una connessione su IPv6 a nodi che si trovano dietro dispositivi NAT non provvisti di IPv6, definendo un modo per incapsulare pacchetti IPv6 in pacchetti UDP IPv4, rendendo possibile l&#39; attraversamento  NAT e fornendo all&#39;host un indirizzo globale dal quale chiunque in Internet può inviare /ricevere traffico.&lt;br /&gt;Questo protocollo è alternativo a 6to4, il quale necessita di un indirizzo pubblico e della funzionalità di 6to4 routing implementata sul dispositivo.&lt;br /&gt;L&#39; infrastruttura Teredo è formata da i seguenti componenti:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Teredo Clients&lt;/li&gt;&lt;li&gt;Teredo Servers&lt;/li&gt;&lt;li&gt;Teredo Relays&lt;/li&gt;&lt;li&gt;Teredo Host-specific Relays&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhx1oJv2k_FE3eMXjakFKGrJO7z8jtDzs9Kj8t3clWkCyfclp_4n7HwwSK57Ex3C7UygMM8OcSAjNEekCxhAVvld7YkIS59LSFq7bUtarrECRboXPge9uyqB0zp9G43wFQvU7ik/s1600-h/tered02_big.gif&quot;&gt;&lt;img style=&quot;margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhx1oJv2k_FE3eMXjakFKGrJO7z8jtDzs9Kj8t3clWkCyfclp_4n7HwwSK57Ex3C7UygMM8OcSAjNEekCxhAVvld7YkIS59LSFq7bUtarrECRboXPge9uyqB0zp9G43wFQvU7ik/s400/tered02_big.gif&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5169397865813236642&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Principalmente un client Teredo comunica con un server Teredo allo scopo di ottenere in Internet un indirizzo IPv6, per poter comunicare con altri client Teredo o con altre macchine aventi indirizzo IPv6.&lt;br /&gt;Il client Teredo è incluso in Windows XP SP2, Windows XP SP1 con l&#39; Advanced Networking Pack for Windows XP, Windows Server 2003 con Service Pack 1, Windows Server 2003 Service Pack 2, Windows Vista, e Windows Server 2008.&lt;br /&gt;Il relay Teredo ha invece la funzione di forwardare pacchetti tra client Teredo in Internet IPv4 e host IPv6-only.</description><link>http://middlewares.blogspot.com/2008/02/teredo.html</link><author>noreply@blogger.com (Ska)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhx1oJv2k_FE3eMXjakFKGrJO7z8jtDzs9Kj8t3clWkCyfclp_4n7HwwSK57Ex3C7UygMM8OcSAjNEekCxhAVvld7YkIS59LSFq7bUtarrECRboXPge9uyqB0zp9G43wFQvU7ik/s72-c/tered02_big.gif" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-35347839.post-6835128182706378203</guid><pubDate>Sun, 07 Oct 2007 12:29:00 +0000</pubDate><atom:updated>2007-10-07T15:02:00.399+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Pnrp</category><title>P2P e PNRP su XP</title><description>Il P2P networking stack non è installato di default su Windows XP ( diversamente da Vista ).&lt;br /&gt;Per installarlo su Windows XP con service pack 2, bisogna seguire i passi elencati qui sotto:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Start &gt; Pannello di controllo &gt; Aggiungi/Rimuovi programmi&lt;/li&gt;&lt;li&gt;Installazione componenti di Windows&lt;/li&gt;&lt;li&gt;Spuntare servizi di rete e selezionare Dettagli&lt;/li&gt;&lt;li&gt;Spuntare la checkbox Peer-to-Peer e selezionare OK&lt;/li&gt;&lt;li&gt;Cliccare su Next e seguire le istruzioni sullo schermo&lt;/li&gt;&lt;/ol&gt;Oltre a questi passi, se si ha il service pack 1 anzichè il 2, allora bisognerà installare anche Windows Networking Pack per Windows XP.&lt;br /&gt;Bisognerà inoltre aggiungere, tra le eccezioni del firewall, il PNRP.&lt;br /&gt;Successivamente è necessario scaricare è installare l&#39; aggiornamente &lt;a href=&quot;http://www.microsoft.com/downloads/details.aspx?familyid=55219164-EC71-4A32-A648-4ED2582EBC7C&amp;amp;displaylang=it&quot;&gt;WindowsXP-KB920342-x86-ITA&lt;/a&gt;, ( è molto importante controllare che la lingua dell&#39; aggiornamento che si sta per scaricare sia uguale a quella del impostata nel sistema operativo ).&lt;br /&gt;A questo punto, visto che Pnrp funziona con IPv6, si dovrà installare tale supporto; questo potrà essere fatto digitando da console &quot;install ipv6&quot; e battendo invio. Naturalmente bisognerà controllare che una volta installato, tale supporto, sia abilitato tra le proprietà della scheda di rete che dovrà usare il Pnrp.&lt;br /&gt;Se si è dietro router, si dovranno forwardare le porte 3540 udp ( Teredo ) e la 3587 tcp ed dietro firewall comunque tali porte andranno aperte.</description><link>http://middlewares.blogspot.com/2007/10/p2p-e-pnrp-su-xp.html</link><author>noreply@blogger.com (Ska)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-35347839.post-3296156965804662150</guid><pubDate>Mon, 01 Oct 2007 11:13:00 +0000</pubDate><atom:updated>2007-10-07T16:02:57.301+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Pnrp</category><title>PNRP</title><description>In ambiente peer-to-peer, la problematica principale è rappresentata dalla risoluzione dei nomi dei peer. Microsoft risolvere questo problema con il Peer Name Resolution Protocol (PNRP), sviluppato prima per Windows XP, e successivamente aggiornato in Windows Vista.&lt;br /&gt;Come si può leggere dalla documentazione tecnica, PNRP funziona in modo totalmente diverso dagli altri sistemi di risoluzione dei nomi ed offre le seguenti proprietà:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Distribuito e senza server&lt;/li&gt;&lt;li&gt;Agevole pubblicazione del nome senza intervento di terzi ( al contratio di DNS )&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Aggiornamento in tempo reale ( al contratio di DNS )&lt;/li&gt;&lt;li&gt;Nomi oltre l&#39; identificazione della macchina ( si posso assegnare nomi a singoli servizi )&lt;/li&gt;&lt;li&gt;Pubblicazione protetta dei nomi ( è possibile usare una modalità sicura )&lt;/li&gt;&lt;/ul&gt;Pnrp si basa sui &lt;span style=&quot;font-weight: bold; color: rgb(255, 0, 0);&quot;&gt;Clouds&lt;/span&gt;, cioè un raggruppamento di computer in grado di individuarsi reciprocamente. I Clouds offerti da PNRP sono due:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;La cloud global: rappresenta tutti i computer sull&#39; intera internet IPv6&lt;/li&gt;&lt;li&gt;La cloud local: ambito di indirizzi IPv6 locali&lt;/li&gt;&lt;/ul&gt;Il peer è identificato da un &lt;span style=&quot;font-weight: bold; color: rgb(255, 0, 0);&quot;&gt;nome&lt;/span&gt; che rappresenta l&#39; endpoint per la comunicazione; questo può essere indiferentemente un computer, un utente, un servizio o un qualsiasi altro oggetto.&lt;br /&gt;I nomi possono essere registrati in maniera sicura o non sicura. Nel primo caso saranno protetti da certificato e firma digitale.&lt;br /&gt;L&#39; &lt;span style=&quot;font-weight: bold; color: rgb(255, 0, 0);&quot;&gt;ID PNRP&lt;/span&gt; del peer ha una lunghezza di 256 bits:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;128 bit che rappresentano l&#39; ID P2P, un hash nome attribuito ad un endpoint che a sua volta è diviso in &lt;span style=&quot;font-style: italic;&quot;&gt;Authority.Classifier&lt;/span&gt;; nei nomi non sicuri, &lt;span style=&quot;font-style: italic;&quot;&gt;Authority&lt;/span&gt; è 0. &lt;span style=&quot;font-style: italic;&quot;&gt;Classifier&lt;/span&gt; identifica l&#39; applicazione è può essere una stringa Unicode di lunghezza massima di 250 caratteri&lt;/li&gt;&lt;li&gt;Gli altri 128 bits sono un numero generato che identifica diverse instanze dello stesso ID P2P sullo stesso cloud&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgR3Fakpo8m81mmbU95y9fxTNDceyGldAJ_VD-7gaj1thW630EVk1MhOBC5dNkQ9xHHjjLcLxglFilxLGQ0YbIglIAEFONCywYYzRdx8Bos5nbi0axSo6oYJO_wzsRrcbSbNUPr/s1600-h/pnrp01.gif&quot;&gt;&lt;img style=&quot;margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgR3Fakpo8m81mmbU95y9fxTNDceyGldAJ_VD-7gaj1thW630EVk1MhOBC5dNkQ9xHHjjLcLxglFilxLGQ0YbIglIAEFONCywYYzRdx8Bos5nbi0axSo6oYJO_wzsRrcbSbNUPr/s400/pnrp01.gif&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5117186664783751410&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Per quanto riguarda la risoluzione dei nomi, questa si compone di due fasi:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Determinazione dell&#39; endpoint (risoluzione dell&#39; indirizzo ipv6 del peer che espone il servizio)&lt;/li&gt;&lt;li&gt;Risoluzione dell&#39; ID PNRP&lt;/li&gt;&lt;/ol&gt;Durante la determinazione dell&#39;endpoint, PNRP utilizza un processo iterativo per individuare il nodo che ha pubblicato l&#39;ID PNRP. Nel processo, il nodo che sta eseguendo la risoluzione ha il compito di contattare in successione i nodi più vicini all&#39;ID PNRP finale.&lt;br /&gt;&lt;br /&gt;Per eseguire la risoluzione del nome in PNRP, il peer esamina le voci nella propria cache alla ricerca di un elemento che corrisponda all&#39;ID PNRP finale. In caso di esito positivo, il peer invia un messaggio di richiesta PNRP al peer e attende la risposta. In caso negativo, se il peer trova però un ID PNRP che somiglia a quello richiesto, manda al richiedente come risposta l&#39; IPv6 di tale peer, e quindi il richiedente interrogherà quest&#39; ultimo peer. Se invece il peer interrogato non trova l&#39; ID PNRP richiesto, ne uno somigliate, allora questo manderà un messaggio con la situazione accertata al richiedente che sceglierà il secondo ID PNRP più vicino.&lt;br /&gt;Consideriamo il seguente scenario, e supponiamo che il peer A desidera determinare l&#39;endpoint relativo all&#39;ID PNRP di 800&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKNZc5FDg1KM2ZdImRyesbHJvhp5sJSzlc0yMIjc4bdTjSRE6BMhJCpXxJvTK2rWmpL0529-xibd0YYkXGoYPtnDlYF5Ua-nSvgbRmX3KOeCgkx1HbdtTvfI5W12OgHQTM5VQ_/s1600-h/pnrp02-sm.gif&quot;&gt;&lt;img style=&quot;margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiKNZc5FDg1KM2ZdImRyesbHJvhp5sJSzlc0yMIjc4bdTjSRE6BMhJCpXxJvTK2rWmpL0529-xibd0YYkXGoYPtnDlYF5Ua-nSvgbRmX3KOeCgkx1HbdtTvfI5W12OgHQTM5VQ_/s400/pnrp02-sm.gif&quot; alt=&quot;&quot; id=&quot;BLOGGER_PHOTO_ID_5117730059751074050&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Dato che 500 è numericamente più vicino a 800, il peer A invia un messaggio di richiesta PNRP al nodo che ha registrato l&#39;ID PNRP di 500 (peer C)&lt;/li&gt;&lt;li&gt;Il peer C non ha voci relative all&#39;ID PNRP di 800 o più vicine a 800, quindi risponde al peer A illustrando tale situazione.&lt;/li&gt;&lt;li&gt;Dato che 450 è il secondo numericamente più vicino a 800, il peer A invia un messaggio di richiesta PNRP al nodo che ha registrato l&#39;ID PNRP di 450 (peer B)&lt;/li&gt;&lt;li&gt;che dispone nella cache di una voce relativa all&#39;ID PNRP ID di 800 e quindi invia l&#39;indirizzo IPv6 del peer E al peer A &lt;/li&gt;&lt;li&gt;Il peer A invia una richiesta PNRP al peer E &lt;/li&gt;&lt;li&gt;Il peer E risponde positivamente al peer A con la risoluzione del nome&lt;/li&gt;&lt;/ol&gt;&lt;span style=&quot;font-size:78%;&quot;&gt;Fonte &lt;a href=&quot;http://www.microsoft.com/technet/network/p2p/pnrp.mspx&quot;&gt;microsoft technet&lt;/a&gt;&lt;/span&gt;</description><link>http://middlewares.blogspot.com/2007/10/pnrp.html</link><author>noreply@blogger.com (Ska)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgR3Fakpo8m81mmbU95y9fxTNDceyGldAJ_VD-7gaj1thW630EVk1MhOBC5dNkQ9xHHjjLcLxglFilxLGQ0YbIglIAEFONCywYYzRdx8Bos5nbi0axSo6oYJO_wzsRrcbSbNUPr/s72-c/pnrp01.gif" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-35347839.post-3805563915500093287</guid><pubDate>Wed, 20 Jun 2007 08:50:00 +0000</pubDate><atom:updated>2007-10-05T07:39:10.574+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">DHT</category><title>DHT, Distributed Hash Tables</title><description>Nell&#39; ambito dei sistemi distribuiti e decentralizzati, la tabella hash distribuita ha rappresentato una svolta.&lt;br /&gt;Applicata in molti nuovi sistemi peer to peer (BitTorrent, Kademlia ...), sono stati sviluppati molti algoritmi basati su questa architettura, ed alcuni sono ancora in sviluppo come ad esempio &lt;span style=&quot;font-weight: bold; color: rgb(255, 0, 0);&quot;&gt;Chord&lt;/span&gt;.&lt;br /&gt;L&#39; idea di questo tipo di algoritmi è di usare una funzione di hash per mappare la risorsa da cercare (un oggetto, un servizio o più semplicemente un file come nel caso delle reti peer to peer) con un identificativo unico, e nel distribuire il range dei possibili valori della funzione di hash tra tutti i nodi della rete.&lt;br /&gt;In generale le DHT offrono due servizi:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Lookup(key)&lt;/li&gt;&lt;li&gt;Insert(key, value)&lt;/li&gt;&lt;/ul&gt;dove key identifica la risorsa e value l&#39; indirizzo logico dell&#39; host.&lt;br /&gt;&lt;br /&gt;Vadiamo come funziona l&#39; algoritmo Chord nella sua forma più semplice.&lt;br /&gt;E&#39; importante notare che i nodi e le key condividono lo stesso &lt;span style=&quot;font-weight: bold;&quot;&gt;spazio degli identificatori&lt;/span&gt;, cioè l&#39; hashing ottenuto con SHA-1, dal quale si possono ottenere 2^160 identificatori.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;L&#39; id (value) di un nodo è ottenuto dall&#39; hash del suo indirizzo ip, mentre la key dall&#39; hash del valore della chiave cercata.&lt;/li&gt;&lt;li&gt;I possibili identificatori vengono organizzati in cerchio, in ordine crescente&lt;/li&gt;&lt;li&gt;Una key &lt;span style=&quot;font-weight: bold;&quot;&gt;K,&lt;/span&gt; viene assegnata al primo nodo il cui identificatore è uguale o maggiore di K&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;font-weight: bold;&quot;&gt;N&lt;/span&gt; viene indicato come nodo successore della key, successor(&lt;span style=&quot;font-weight: bold;&quot;&gt;K&lt;/span&gt;)&lt;/li&gt;&lt;/ol&gt;Un possibile algoritmo di routing, molto semplice, si può realizzare facendo in modo che ogni nodo conosca esclusivamente il link verso il suo successore.</description><link>http://middlewares.blogspot.com/2007/06/dht-distributed-hash-tables.html</link><author>noreply@blogger.com (Ska)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-35347839.post-115979196073941122</guid><pubDate>Mon, 02 Oct 2006 11:49:00 +0000</pubDate><atom:updated>2007-10-05T07:38:43.735+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Corba</category><title></title><description>In quest&#39; articolo farò un esempio per spiegare come si utilizza e come funziona CORBA in pratica. L&#39; esempio consiste di un semplice oggetto calcolatrice, che potrà essere invocato da un client remoto, il quale passerà due parametri al metodo somma che restituirà il risultato.&lt;br /&gt;La prima cosa da fare è construire l&#39; interfaccia in IDL :&lt;br /&gt;&lt;br /&gt;&lt;pre style=&quot;border-style: dashed; border-width: 1px;&quot;&gt;&lt;br /&gt;&lt;br /&gt; // matematica.idl&lt;br /&gt;&lt;br /&gt; module matematica{&lt;br /&gt;&lt;br /&gt;   interface Calcolatrice{&lt;br /&gt;     long somma(in long a, in long b);&lt;br /&gt;   };&lt;br /&gt;&lt;br /&gt; };&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Naturalmente somma sarà il metodo di calcolatrice che esporrà l&#39; interfaccia.&lt;br /&gt;matematica.idl andrà compilato con il seguente comando:&lt;br /&gt;&lt;br /&gt;&lt;pre style=&quot;border-style: dashed; border-width: 1px;&quot;&gt;&lt;br /&gt; idlj -full -oldImplBase matematica.idl&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;L&#39;operazione di sopra causerà la creazione di una directory di nome &quot;matematica&quot; con all&#39; interno i seguenti file:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;_CalcolatriceImplBase.java ( Questa classe rappresenta lo Skeleton )&lt;/li&gt;&lt;li&gt;_CalcolatriceStub.java ( Lo Stub )&lt;/li&gt;&lt;li&gt;Calcolatrice.java                        ( Definisce l&#39; interfacia dell&#39; oggetto CORBA ) &lt;/li&gt;&lt;li&gt;CalcolatriceOperations.java     ( Definisce l&#39; interfacia dell&#39; oggetto CORBA )&lt;/li&gt;&lt;li&gt;CalcolatriceHelper.java ( Verrà spiegato più avanti )&lt;br /&gt;&lt;/li&gt;&lt;li&gt;CalcolatriceHolder.java            ( Verrà spiegato più avanti )&lt;/li&gt;&lt;/ul&gt;Ora la prossima cosa da fare è &quot;specializzare&quot; lo skeleton, in quanto _CalcolatriceImplBase è una classe astratta. Quindi:&lt;br /&gt;&lt;br /&gt;&lt;pre style=&quot;border-style: dashed; border-width: 1px;&quot;&gt;&lt;br /&gt;&lt;br /&gt; // CalcolatriceImpl.java&lt;br /&gt;&lt;br /&gt; package matematica;&lt;br /&gt;&lt;br /&gt; import matematica.*;&lt;br /&gt;&lt;br /&gt; public class CalcolatriceImpl extends _CalcolatriceImplBase {&lt;br /&gt;&lt;br /&gt;   public CalcolatriceImpl() {&lt;br /&gt;&lt;br /&gt;     super();&lt;br /&gt;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   public int somma(int a, int b){&lt;br /&gt;&lt;br /&gt;     return a + b;&lt;br /&gt;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Implementiamo ora la classe server:&lt;br /&gt;&lt;br /&gt;&lt;pre style=&quot;border-style: dashed; border-width: 1px;&quot;&gt;&lt;br /&gt;&lt;br /&gt;// CalcolatriceServer.java&lt;br /&gt;&lt;br /&gt;package server;&lt;br /&gt;&lt;br /&gt;import matematica.*;&lt;br /&gt;import java.io.*;&lt;br /&gt;&lt;br /&gt;public class CalcolatriceServer{&lt;br /&gt;&lt;br /&gt;  public static void main(String[] args){&lt;br /&gt;&lt;br /&gt;    if(args.length != 1) {&lt;br /&gt;      System.err.println(&quot;Manca l&#39;argomento: path file ior\n&quot;);&lt;br /&gt;      return;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    try{&lt;br /&gt;&lt;br /&gt;      // Inizializza l&#39;ORB&lt;br /&gt;      org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, null);&lt;br /&gt;&lt;br /&gt;      // Crea un oggetto Calcolatrice&lt;br /&gt;      CalcolatriceImpl calc = new CalcolatriceImpl();&lt;br /&gt;&lt;br /&gt;      // Stampa l&#39;object reference in versione stringa&lt;br /&gt;      System.out.println(&quot;Creata Calcolatrice:\n&quot; +&lt;br /&gt;                                     orb.object_to_string(calc));&lt;br /&gt;&lt;br /&gt;      // Scrive l&#39;object reference nel file&lt;br /&gt;      PrintWriter out = new PrintWriter(new BufferedWriter(&lt;br /&gt;                                        new FileWriter(args[0])));&lt;br /&gt;      out.println(orb.object_to_string(calc));&lt;br /&gt;      out.close();&lt;br /&gt;&lt;br /&gt;      // Attende l&#39; invocazione di un client&lt;br /&gt;      java.lang.Object sync = new java.lang.Object();&lt;br /&gt;      synchronized (sync) {&lt;br /&gt;        sync.wait();&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;    }catch (Exception e) {&lt;br /&gt;      System.err.println(&quot;Server error: &quot; + e);&lt;br /&gt;      e.printStackTrace(System.out);&lt;br /&gt;    }&lt;br /&gt;  &lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;A questo punto è doverosa un precisazione.&lt;br /&gt;In questo esempio si sta utilizzando come reference per l&#39; oggetto un filesystem, perchè per il momento siamo interessati meccanismo di funzionamento base di CORBA. Quindi questo esempio funzionerà sicuramente eseguendo client e server sulla stessa macchina, ma affinchè funzioni anche su due macchine separate è necessario che entrambe abbiano un porzione di filesytem in comune, dove poter scrivere/leggere il file calc.ior, il nostro &quot;object reference&quot;.&lt;br /&gt;Fatta questa precisazione implementiamo il client:&lt;br /&gt;&lt;br /&gt;&lt;pre style=&quot;border-style: dashed; border-width: 1px;&quot;&gt;&lt;br /&gt;&lt;br /&gt;  // CalcolatriceClient.java&lt;br /&gt;&lt;br /&gt;  package client;&lt;br /&gt;&lt;br /&gt;  import matematica.*;&lt;br /&gt;  import java.io.*;&lt;br /&gt;&lt;br /&gt;  public class CalcolatriceClient{&lt;br /&gt;&lt;br /&gt;    public static void main(String args[]){&lt;br /&gt;&lt;br /&gt;      if(args.length!=1){&lt;br /&gt;        System.err.println(&quot;Manca argomento: path file ior&quot;);&lt;br /&gt;        return;&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      try{&lt;br /&gt;&lt;br /&gt;        // Crea e inizializza l&#39; ORB&lt;br /&gt;        org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, null);&lt;br /&gt;&lt;br /&gt;        // Legge dal file il reference all&#39; oggetto&lt;br /&gt;        // Si assume che il server lo abbia generato&lt;br /&gt;        BufferedReader in = new BufferedReader(new FileReader(args[0]));&lt;br /&gt;        String ior = in.readLine();&lt;br /&gt;        in.close();&lt;br /&gt;&lt;br /&gt;        // Ottiene dal reference un oggetto remoto ...&lt;br /&gt;        org.omg.CORBA.Object obj = orb.string_to_object(ior);&lt;br /&gt;&lt;br /&gt;        // ...e ne effettua il narrow a tipo Calcolatrice&lt;br /&gt;        Calcolatrice calc = CalcolatriceHelper.narrow(obj);&lt;br /&gt;&lt;br /&gt;        // Ottiene da input tastiera i 2 numeri da sommare&lt;br /&gt;        BufferedReader inputUser = new BufferedReader(&lt;br /&gt;                                   new InputStreamReader(System.in));&lt;br /&gt;        String first, second;&lt;br /&gt;        int a, b;&lt;br /&gt;&lt;br /&gt;        // Leggo primo addendo&lt;br /&gt;        System.out.println();&lt;br /&gt;        System.out.println(&quot;A = &quot;);&lt;br /&gt;        first = inputUser.readLine();&lt;br /&gt;        a = Integer.valueOf(first).intValue();&lt;br /&gt;&lt;br /&gt;        // Leggo secondo addendo&lt;br /&gt;        System.out.println();&lt;br /&gt;        System.out.println(&quot;B = &quot;);&lt;br /&gt;        second = inputUser.readLine();&lt;br /&gt;        b = Integer.valueOf(second).intValue();&lt;br /&gt;&lt;br /&gt;        // Invoca il metodo remoto passandogli i parametri&lt;br /&gt;        System.out.println();&lt;br /&gt;        System.out.println(&quot;Il risultato è: &quot;);&lt;br /&gt;        System.out.println(calc.somma(a, b));&lt;br /&gt;&lt;br /&gt;      }catch (Exception e){&lt;br /&gt;        e.printStackTrace();&lt;br /&gt;      }&lt;br /&gt;  &lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;</description><link>http://middlewares.blogspot.com/2006/10/in-quest-articolo-far-un-esempio-per.html</link><author>noreply@blogger.com (Ska)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-35347839.post-115972448813298861</guid><pubDate>Sun, 01 Oct 2006 17:35:00 +0000</pubDate><atom:updated>2007-10-05T07:38:00.347+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Corba</category><title></title><description>&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://photos1.blogger.com/blogger/5164/3307/1600/corba.0.gif&quot;&gt;&lt;img style=&quot;margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;&quot; src=&quot;http://photos1.blogger.com/blogger/5164/3307/320/corba.0.png&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;Diamo uno sguardo all&#39; architettura corba.&lt;br /&gt;Come si può vedere dalla figura il cuore dell&#39; architettura è il canale di comunicazione ( ORB ).&lt;br /&gt;Fornisce l&#39; infrastruttura che permette agli oggetti di comunicare indipendentemente dal linguaggio e dalla piattaforma adottata. ORB nasconde al client tutti i dettagli sulla localizzazione degli oggetti sulla rete e sul loro linguaggio di implementazione; l&#39; ORB individua l&#39; oggetto sulla rete e effettua le necessarie traslazioni nel linguaggio di implementazione ( naturalmente per quei linguaggi per i quali è stato definito un mapping ). Praticamente l&#39; ORB nasconde al client che l&#39; oggetto che sta invocando si trova in remoto.&lt;br /&gt;Il &lt;span style=&quot;font-weight: bold; color: rgb(255, 0, 0);&quot;&gt;Client&lt;/span&gt; invoca i metodi del &lt;span style=&quot;font-weight: bold; color: rgb(255, 0, 0);&quot;&gt;Servant&lt;/span&gt; che invece è l&#39; implementazione dell&#39; oggetto remoto; quest&#39; invocazione avviene tramite l&#39; entità logica &lt;span style=&quot;font-weight: bold; color: rgb(255, 0, 0);&quot;&gt;ORB&lt;/span&gt; che fornisce i meccanismi per inviare le richieste da un client all&#39; oggetto remoto. L&#39; ORB è definito tramite un interfaccia astratta che nasconde completamente alle applicazioni i dettagli sull&#39; implementazione: &lt;span style=&quot;font-weight: bold; color: rgb(255, 0, 0);&quot;&gt;ORB Interface&lt;/span&gt;.&lt;br /&gt;&lt;span style=&quot;color: rgb(255, 0, 0); font-weight: bold;&quot;&gt;IDL Stub&lt;/span&gt; fa da collante tra client e ORB, occupandosi del &quot;marshalling&quot; dei dati, mentre dualmente, &lt;span style=&quot;font-weight: bold; color: rgb(255, 0, 0);&quot;&gt;IDL Skeleton&lt;/span&gt; fa da collante tra servant e ORB e fa l&#39; &quot;unmarshalling dei dati&quot;.&lt;br /&gt;Sono anche presenti &lt;span style=&quot;font-weight: bold; color: rgb(255, 0, 0);&quot;&gt;DII&lt;/span&gt;, che consente ad un client di invocare un oggetto remoto senza conoscere la definizione della sua interfaccia e senza avere un legame con lo stub, e il &lt;span style=&quot;font-weight: bold; color: rgb(255, 0, 0);&quot;&gt;DSI&lt;/span&gt; che consente a ORB di recapitare un request ad un oggetto che non ha uno skeleton statico.&lt;br /&gt;Un altro componente molto importante nell&#39; architettura ORB è l&#39; Object Adapter, che assiste ORB nel recapitare le request a un oggetto e nelle operazioni di attivazione/disattivazione degli oggetti.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur=&quot;try {parent.deselectBloggerImageGracefully();} catch(e) {}&quot; href=&quot;http://photos1.blogger.com/blogger/5164/3307/1600/corba.gif&quot;&gt;&lt;br /&gt;&lt;/a&gt;</description><link>http://middlewares.blogspot.com/2006/10/diamo-uno-sguardo-all-architettura.html</link><author>noreply@blogger.com (Ska)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-35347839.post-115972345551667537</guid><pubDate>Sun, 01 Oct 2006 16:39:00 +0000</pubDate><atom:updated>2007-10-05T07:38:00.347+02:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Corba</category><title></title><description>&lt;span style=&quot;font-weight: bold; color: rgb(255, 0, 0);&quot;&gt;CORBA&lt;/span&gt; ( &lt;span style=&quot;font-style: italic;&quot;&gt;Common Object Request Broker Architecture&lt;/span&gt; ) è un middleware, cioè uno strato di software posto tra la lo strato di rete del sistema operativo e quello applicativo; definisce un&#39; infrastruttura standard per la comunicazione tra e con oggetti remoti distribuiti ovunque distribuiti, indipendentemente dal linguaggio usato per l&#39; implementazione e dalla piattaforma di esecuzione.&lt;br /&gt;Questo significa che gli oggetti possono essere scritti in un qualsiasi linguaggio per il quale è stato creato un mapping CORBA ( quasi tutti i linguaggi più conosciuti ).&lt;br /&gt;Questi oggetti saranno in grado di comunicare tra loro grazie all&#39; &lt;span style=&quot;font-weight: bold; color: rgb(255, 0, 0);&quot;&gt;ORB&lt;/span&gt; ( &lt;span style=&quot;font-style: italic;&quot;&gt;Object Request Broker&lt;/span&gt; ), che è appunto il canale di comunicazione dell&#39; ambiente distribuito.&lt;br /&gt;Gli altri principi sui quali è basato corba sono:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Separazione tra l&#39; interfaccia e l&#39; implementazione&lt;/li&gt;&lt;li&gt;Trasparenza della localizzazione delle risorse&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Ogni riferimento a un oggetto ha un tipo definito nella sua interfaccia&lt;/li&gt;&lt;/ul&gt;</description><link>http://middlewares.blogspot.com/2006/10/corba-common-object-request-broker.html</link><author>noreply@blogger.com (Ska)</author><thr:total>0</thr:total></item></channel></rss>