2009-07-06 11 views
6

Sto utilizzando WCF in .NET 3.5 per implementare un'applicazione di rete peer to peer. Per risolvere i nodi peer sto usando PNRP.WCF Peer to Peer, ci sono nodi là fuori?

IGlobalStoreServiceContract è il mio contratto come mostrato di seguito,

[ServiceContract(Namespace = "http://GlobalStoreEventDriven.API", CallbackContract = typeof(IGlobalStoreServiceContract))] 
internal interface IGlobalStoreServiceContract 
{ 
    [OperationContract(IsOneWay = true)] 
    void NotifyGlobalStoreDataInserted(string globalGroup, DateTime maxDateTime); 

    [OperationContract(IsOneWay = true)] 
    void RegisterNode(); 

    [OperationContract(IsOneWay = true)] 
    void SynchronizeMemberList(Guid clientId); 
} 

Sto usando un po 'di codice come questo per unire ogni nodo per la rete peer to peer.

La mia domanda è non appena ho aperto il canale come posso meglio dire se altri nodi peer sono in rete?

Per esempio, potrei chiamare uno dei metodi nel mio RegisterNode del contratto e ogni nodo della rete potrebbe utilizzare una richiamata per chiamare SynchronizeMemberList. Vorrei quindi sapere se c'erano altri nodi.

Il problema è che è tutto asincrono. Se chiamo RegisterNode e nessuno risponde, in realtà non significa che nessuno è lì, potrebbe solo significare che non ho aspettato abbastanza.

Che cosa ne pensi? Eventuali suggerimenti?

risposta

5

Vedi Peer-to-Peer Programming with WCF and .NET Framework 3.5: Peer Name da Amit Bahree e Chris Peiris:

Il passo logico finale dopo la creazione e la pubblicazione di un peer sta risolvendo un peer . A che serve pubblicare qualcosa nel cloud se un altro peer non ti trova? Usiamo la classe PeerNameResolver per risolvere per un peer specifico in un dato cloud. o a seconda dei parametri passati a . Il processo di risoluzione termina quando viene raggiunto il numero massimo di registrazioni per lo PeerRecordCollection o quando ha raggiunto la fine di varie nubi .

La classe PeerNameResolver espone un metodo sovraccarico chiamato Resolve e viene utilizzato per risolvere un dato peer in modo sincrono.

L'elenco 17 mostra come provare a risolvere un peer chiamato MySecurePeer. Il metodo Resolve restituisce una raccolta di tipo PeerNameRecordCollection attraverso cui viene iterata. Il Listato 18 mostra il risultato di questo quando si esegue su un computer che ha tre schede di rete.

PeerName myPeer = new PeerName("MySecurePeer", PeerNameType.Secured); 
PeerNameResolver resolver = new PeerNameResolver(); 

PeerNameRecordCollection results = resolver.Resolve(myPeer); 

Console.WriteLine("{0} Peers Found:", results.Count.ToString()); 
int i = 1; 

foreach (PeerNameRecord peer in results) 
{ 
    Console.WriteLine("{0} Peer:{1}", i++, peer.PeerName.ToString()); 
    foreach (IPEndPoint ip in peer.EndPointCollection) 
    { 
     Console.WriteLine("\t Endpoint: {0}", ip.ToString()); 
    } 
} 

Quindi, credo che si dovrebbe verificare PeerNameResolver.Resolve Method:

Questo metodo associa scrutare i nomi di nuvole. Chiamare il metodo PeerNameResolver è simile a chiamare il metodo ResolveResolve per ogni nome peer record nello PeerNameRecordCollection.Si noti che utilizzando il metodo Resolve su un record di nome peer singolo non corrisponde a invalidando la risoluzione di più nomi peer .

Per ogni metodo Resolve, è disponibile un metodo equivalente ResolveAsync. Sono identici nei parametri che sono passati a , con la differenza che il metodo include un token di sistema nell'elenco di parametri per la gestione di eventi asincroni .

Problemi correlati