Domanda

Sto cercando un modo per ottenere due programmi per trasmettere in modo efficiente una grande quantità di dati tra di loro, che ha bisogno di lavorare su Linux e Windows, in C ++. Il contesto qui è un P2P rete che agisce come un nodo sulla rete e funziona continuamente, e altre applicazioni (che poteva essere giochi da qui la necessità di una soluzione veloce) userà questo per comunicare con altri nodi della rete. Se c'è una soluzione migliore per questo sarei interessato.

È stato utile?

Soluzione

boost :: asio è un cross-platform movimentazione io asincrona su socket libreria. È possibile combinare questo con l'utilizzo ad esempio Google buffer protocollo per i messaggi attuali.

Boost fornisce anche boost :: inteprocessuale per la comunicazione tra processi sulla stessa macchina, ma ASIO ti permette di fare la vostra comunicazione in modo asincrono e si può facilmente avere gli stessi gestori per entrambe le connessioni locali e remote.

Altri suggerimenti

Sono stato con ICE da ZeroC ( www.zeroc.com ), ed è stato fantastico. Super facile da usare, ed è non solo cross platform, ma ha il supporto per molte lingue, nonché (Python, Java, ecc) e anche una versione integrata di biblioteca.

Bene, se possiamo assumere i due processi sono in esecuzione sulla stessa macchina, allora il modo più veloce per loro di trasferire grandi quantità di dati avanti e indietro è di mantenere i dati all'interno di una regione di memoria condivisa; con tale configurazione, i dati vengono mai copiati affatto, poiché entrambi i processi possono accedere direttamente. (Se si voleva andare ancora oltre, è possibile combinare i due programmi in un unico programma, con l'ex 'processo' ora in esecuzione come un thread all'interno dello stesso spazio di processo, invece. In tal caso sarebbero condividere automaticamente il 100% della loro memoria con l'altro)

Naturalmente, solo che hanno un'area di memoria condivisa non è sufficiente nella maggior parte dei casi: si sarebbe anche bisogno di una sorta di meccanismo di sincronizzazione in modo che i processi possono leggere e aggiornare i dati condivisi in modo sicuro, senza inciampare gli uni sugli altri. Il modo in cui lo farei sarebbe quella di creare due code doppio attacco nella regione di memoria condivisa (una per ogni processo di inviare con). Utilizzare un lockless classe FIFO-coda, o dare ad ogni Deque un semaforo / mutex che è possibile utilizzare per serializzare spingere elementi di dati nella coda e popping elementi dati dalla coda. (Si noti che gli elementi di dati si sarebbe messa in code sarebbe solo i puntatori ai buffer di dati reali, non i dati stessi ... altrimenti saresti tornata a copiare grandi quantità di dati in giro, che si vuole evitare . E 'una buona idea usare shared_ptrs invece di puntatori C pianura, in modo che i dati "vecchi" saranno liberati automaticamente quando il processo di ricezione è fatto usando). Una volta che avete, l'unica altra cosa che ci serve è un modo per il processo A di notificare processo B, quando ha appena messo un elemento in coda per B per ricevere (e viceversa) ... io di solito farlo da scrittura di un byte in un tubo che l'altro processo è select () - Ing. in poi, per causare l'altro processo di svegliarsi e controllare la sua coda, ma ci sono altri modi per farlo, così

Questo è un problema difficile.

Il collo di bottiglia è internet, e che i vostri clienti potrebbero essere sul NAT.

Se non si sta parlando internet, o se esplicitamente non si dispone di client dietro NAT carrier grade male, è necessario dire.

Perché si riduce a: uso di TCP. Suck it up.

Vorrei suggerire buffer protocollo su TCP o UDP socket.

Così, mentre le altre risposte coprono una parte del problema (librerie presa), non sono raccontandovi il problema NAT. Piuttosto che avere i vostri utenti armeggiare con i loro router, è meglio utilizzare alcune tecniche che dovrebbe ottenere attraverso un router vagamente sano senza alcuna configurazione supplementare. È necessario utilizzare tutti questi per ottenere la migliore compatibilità.

In primo luogo, ICE biblioteca qui è una tecnica NAT traversal che funziona con STUN e / o girare i server in rete. Potrebbe essere necessario fornire alcune infrastrutture per far funzionare tutto questo, anche se ci sono alcuni server STUN pubblico.

In secondo luogo, utilizzare sia UPnP e NAT-PMP. Una biblioteca qui , per esempio.

In terzo luogo, utilizzare IPv6. Teredo, che è un modo di correre IPv6 su IPv4, spesso funziona quando nessuna delle precedenti fare, e chi lo sa, i tuoi utenti potrebbero avere lavoro IPv6 con altri mezzi. Pochissimo codice per implementare questo, e sempre più importante. Trovo circa la metà dei dati Bittorrent arriva su IPv6, per esempio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top