Question

Je cherche un moyen d'obtenir deux programmes pour transmettre efficacement une grande quantité de données à l'autre, qui doit travailler sur Linux et Windows, en C ++. Le contexte est ici un programme de réseau P2P qui agit comme un nœud sur le réseau et fonctionne en continu, et d'autres applications (qui pourraient être des jeux d'où la nécessité d'une solution rapide) va utiliser pour communiquer avec d'autres nœuds du réseau. S'il y a une meilleure solution pour cela, je serais intéressé.

Était-ce utile?

La solution

boost :: asio est une plate-forme cross bibliothèque de gestion io asynchrone sur des sockets. Vous pouvez combiner cela avec l'aide par exemple Google Protocol Buffers pour vos messages réels.

Boost vous fournit également boost :: interprocess pour la communication interne à la même machine, mais permet asio-vous votre communication de manière asynchrone et vous pouvez facilement avoir les mêmes gestionnaires pour les connexions locales et distantes.

Autres conseils

J'utilise ICE par zeroc ( www.zeroc.com ), et il a été fantastique. Super facile à utiliser, et il est non seulement multi-plateforme, mais a un support pour de nombreuses langues aussi bien (python, java, etc.) et même une version intégrée de la bibliothèque.

Eh bien, si nous pouvons supposer que les deux processus sont en cours d'exécution sur la même machine, le moyen le plus rapide pour eux de transférer de grandes quantités de données dans les deux sens est en gardant les données à l'intérieur d'une zone de mémoire partagée; avec cette configuration, les données ne sont jamais copiées du tout, puisque les deux processus peuvent y accéder directement. (Si vous voulez aller encore plus loin, vous pouvez combiner les deux programmes en un seul programme, chaque ancien « processus » en cours d'exécution maintenant comme un fil dans le même lieu l'espace de processus. Dans ce cas, ils partageront automatiquement 100% de leur mémoire avec l'autre)

Bien sûr, juste avoir une zone de mémoire partagée ne suffit pas dans la plupart des cas vous aurez également besoin d'une sorte de mécanisme de synchronisation afin que les processus peuvent lire et mettre à jour les données partagées en toute sécurité, sans trébucher sur l'autre. La façon dont je le ferais serait de créer deux files d'attente à deux extrémités dans la région de mémoire partagée (un pour chaque processus d'envoi avec). Soit utiliser une classe FIFO-queue lockless, ou donner à chaque file d'attente à deux extrémités un sémaphores / mutex que vous pouvez utiliser pour sérialiser pousser les éléments de données dans la file d'attente et popping éléments de données de la file d'attente. (Notez que les éléments de données que vous seriez dans les files d'attente mettez seulement seraient des pointeurs vers les tampons de données réelles, pas les données ... sinon vous reviendriez à copier de grandes quantités de données autour, que vous voulez éviter . il est une bonne idée d'utiliser shared_ptrs au lieu des pointeurs C clair, de sorte que les données « anciens » seront libérés automatiquement lorsque le processus de réception est fait à l'utiliser). Une fois que vous avez cela, la seule autre chose que vous auriez besoin est un moyen pour le processus A de notifier le procédé B quand il a mis juste un élément dans la file d'attente B pour recevoir (et vice versa) ... Je généralement que par écrire un octet dans un tuyau que l'autre processus est select () -. ING, à cause de l'autre processus de se réveiller et de vérifier sa file d'attente, mais il y a d'autres façons de le faire aussi bien

Ceci est un problème difficile.

Le goulot d'étranglement est Internet, et que vos clients pourraient être sur NAT.

Si vous ne parlez pas Internet, ou si vous avez explicitement ne pas les clients derrière classe transporteur mauvais NATs, vous devez dire.

Parce que cela se résume à: utiliser TCP. Suck it up.

Je suggère fortement Protocol Buffers sur TCP ou UDP prises.

Ainsi, alors que les autres réponses couvrent une partie du problème (bibliothèques socket), ils ne sont pas vous parler de la question NAT. Plutôt que d'avoir vos utilisateurs bricoler avec leurs routeurs, il est préférable d'utiliser des techniques qui doivent passer à travers un routeur vaguement sain d'esprit sans configuration supplémentaire. Vous devez utiliser tous ces pour obtenir la meilleure compatibilité.

D'abord, ICE bibliothèque est une technique NAT traversal qui fonctionne avec STUN et / ou TURN serveurs dans le réseau. Vous devrez peut-être fournir une infrastructure pour que cela fonctionne, bien qu'il existe quelques serveurs STUN public.

En second lieu, utiliser à la fois UPnP et NAT-PMP. Une bibliothèque , par exemple.

Troisièmement, utiliser IPv6. Teredo, qui est une façon de fonctionner IPv6 sur IPv4, fonctionne souvent quand aucune de ces faire, et qui sait, vos utilisateurs peuvent avoir travailler IPv6 par d'autres moyens. Très peu de code pour mettre en œuvre, et de plus en plus importante. Je trouve près de la moitié des données Bittorrent arrive sur IPv6, par exemple.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top